简单来说,当我明确知道此次判断的逻辑时就可以直接使用if,但是我这次的判断逻辑可能会随着某个参数变化的时候使用Predicate
比如当我想要判断某长段文字中是否包含list<String> 中的元素,并且包含的元素个数大于 list<String>最后一个被转换为string 格式的int数
这时候作为判断元素的list<String>是不定的,但是逻辑是定了的,所以就可以使用Predicate来构建
public static Predicate<String> createTextChecker(List<String> checkList) {//省略合法性判断// 提取范围int threshold;try {threshold = Integer.parseInt(checkList.get(checkList.size() - 1));} catch (NumberFormatException e) {throw new IllegalArgumentException("列表最后一个元素必须是整数格式");}// 返回判断逻辑return text -> {long count = checkList.stream().limit(checkList.size() - 1) // 排除最后一个阈值元素.filter(element -> text.contains(element)).count();return count > threshold;};
然后你可以这样使用它
List<String> list1 = List.of("长歌", "短笛", "2"); Predicate<String> checker1 = createTextChecker(list1); System.out.println(checker1.test("长歌与风在岭外,短笛声声盼归来。"));
日后作为条件的list1就可以不固定,可以按照逻辑改变
Predicate.negate()
当前的Predicate判断取反
Predicate.or()
这里需要传入一个别的Predicate,当两个Predicate其中一个满足的时候就返回true
Predicate.and()
这里需要传入一个别的Predicate,当两个Predicate都满足的时候就返回true
Predicate.test()
这里需要传入一个参数,就这个例子来说参数类型由上面的方法
Predicate<String> createTextChecker
中的红色位置的类型决定
用于执行判断逻辑
Predicate.equals()
用于对比两个Predicate是否属于同一地址(逻辑一样,但是地址不同也不会判为相同)