Java 11向Predicate接口引入了新方法not()来否定类似于negate方法的现有谓词,进一步增强了其功能,使得条件判断和组合更加灵活和方便。
Predicate.not()
Predicate.not
方法用于创建一个取反的谓词(predicate),即返回一个对输入条件取反的Predicate
。这个方法使得代码更加简洁和易读,特别是与流操作结合使用时。
Predicate.not
方法声明如下:
static <T> Predicate<T> not(Predicate<? super T> target) {Objects.requireNonNull(target);return (Predicate<T>)target.negate();
}
Predicate.not
方法使用如下:
package com.morris.java11;import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** Predicate.not()的使用*/
public class PredicateNotDemo {public static void main(String[] args) {List<Integer> list = Stream.iterate(1, i -> i <= 10, i -> i + 1).filter(Predicate.not(t -> (t % 2) == 0)).collect(Collectors.toList());System.out.println(list); // [1, 3, 5, 7, 9]}
}
多个谓词结合使用
可以通过使用Predicate
接口的组合方法(如and
、or
、negate
)来创建更复杂的条件判断。
package com.morris.java11;import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;/*** Predicate中and/or/not结合使用*/
public class PredicateComplexDemo {public static void main(String[] args) {List<String> names = List.of("Alice", "Bob", "", "Charlie", "David");// 创建多个谓词Predicate<String> startsWithA = name -> name.startsWith("A");Predicate<String> lengthGreaterThanThree = name -> name.length() > 3;// 组合谓词Predicate<String> complexPredicate = startsWithA.or(lengthGreaterThanThree).and(Predicate.not(String::isEmpty));List<String> filteredNames = names.stream().filter(complexPredicate).collect(Collectors.toList());System.out.println(filteredNames); // 输出 ["Alice", "Charlie", "David"]}
}