📜  带有示例的Java 8 谓词(1)

📅  最后修改于: 2023-12-03 14:54:05.849000             🧑  作者: Mango

带有示例的Java 8 谓词

Java 8 引入了谓词(Predicate)接口,它可以被用来对多种类型的对象进行筛选。谓词可以被用来代替传统的 if-else 语句,使代码更简洁、易读。

Predicate 接口

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 接口进行不同类型对象的筛选。

筛选字符串长度为 5 的元素
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]
筛选年龄小于 30 的学生
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 接口能极大地简化代码,加快开发速度,同时使代码更易读、易维护。