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"]
}
}