📅  最后修改于: 2023-12-03 14:54:05.849000             🧑  作者: Mango
Java 8 引入了谓词(Predicate)接口,它可以被用来对多种类型的对象进行筛选。谓词可以被用来代替传统的 if-else 语句,使代码更简洁、易读。
Predicate 接口是一个函数式接口,它有一个抽象方法 test(T t)
,接受一个类型为 T 的参数,返回一个 boolean 值。Predicate 接口还有一些默认方法和静态方法,用于组合谓词、取反等操作。
下面是 Predicate 接口的定义:
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
下面是一些示例,展示了如何使用 Predicate 接口进行不同类型对象的筛选。
List<String> names = Arrays.asList("apple", "orange", "grape", "banana", "watermelon");
Predicate<String> predicate = (s) -> s.length() == 5;
List<String> result = names.stream().filter(predicate).collect(Collectors.toList());
System.out.println(result); // [apple, grape]
class Student {
private String name;
private int age;
// getter, setter, constructor...
}
List<Student> students = Arrays.asList(
new Student("Amy", 22),
new Student("Bob", 18),
new Student("Cathy", 30),
new Student("David", 25),
new Student("Emma", 28)
);
Predicate<Student> predicate = (s) -> s.getAge() < 30;
List<Student> result = students.stream().filter(predicate).collect(Collectors.toList());
System.out.println(result); // [Amy, Bob, David, Emma]
List<String> names = Arrays.asList("apple", "orange", "grape", "banana", "watermelon");
Predicate<String> predicate1 = (s) -> s.length() == 5;
Predicate<String> predicate2 = (s) -> s.startsWith("a");
List<String> result = names.stream().filter(predicate1.and(predicate2)).collect(Collectors.toList());
System.out.println(result); // [apple]
List<String> names = Arrays.asList("apple", "orange", "grape", "banana", "watermelon");
Predicate<String> predicate = (s) -> s.length() == 5;
List<String> result = names.stream().filter(predicate.negate()).collect(Collectors.toList());
System.out.println(result); // [orange, banana, watermelon]
Predicate<String> predicate1 = Predicate.isEqual("test");
Predicate<String> predicate2 = Predicate.isEqual(null);
System.out.println(predicate1.test("test")); // true
System.out.println(predicate1.test("test2")); // false
System.out.println(predicate2.test("test")); // false
System.out.println(predicate2.test(null)); // true
谓词(Predicate)接口使得对集合中的元素进行筛选变得更加简单方便,特别是在对多个筛选条件进行组合时。通过几个示例,我们可以发现使用 Predicate 接口能极大地简化代码,加快开发速度,同时使代码更易读、易维护。