Java 1.8 Predicate 断言函数式接口

更新时间 2023-07-18 16:38:59

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 1v1 提问 / 学习打卡 / 每月赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目2期已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 288 小节,累计 45w+ 字,讲解图:2012 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1600+ 小伙伴加入,欢迎点击围观

在 Java 1.8 之前,我们在对集合进行筛选和过滤时,通常需要使用循环和条件语句来手动实现。而 Java 1.8 引入的 Predicate 断言接口,为我们提供了一种简单且优雅的方法来进行集合元素的筛选。

什么是 Predicate?

Predicate 是一个函数式接口,它代表了一个接受一个参数并返回布尔值的函数。它通常用于对集合中的元素进行筛选、过滤或判断。

java.util.function 包中,Predicate 接口定义如下:

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

可以看到,Predicate 是一个泛型接口,T 表示传入的参数类型。它只有一个抽象方法 test(T t),用于对传入的参数进行条件判断,并返回一个布尔值,表示传入的参数是否满足特定条件。

如何使用 Predicate?

使用 Predicate 非常简单。首先,我们需要实现 Predicate 接口的抽象方法 test(T t),然后将该实现传递给需要进行条件判断的方法。

假设我们有一个存储整数的集合,我们想筛选出其中的偶数。在 Java 1.8 之前,我们可能会这样写:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = new ArrayList<>();

for (Integer num : numbers) {
    if (num % 2 == 0) {
        evenNumbers.add(num);
    }
}

然而,使用 Predicate,我们可以这样写:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.stream()
                                  .filter(num -> num % 2 == 0)
                                  .collect(Collectors.toList());

在上述代码中,我们使用了 filter() 方法来进行筛选。filter() 方法接受一个 Predicate 参数,表示我们希望保留满足条件的元素。在这里,我们使用 Lambda 表达式 num -> num % 2 == 0 来实现 Predicate 接口,并判断整数是否为偶数。

组合 Predicate

有时候,我们需要对多个条件进行组合,可以使用 Predicate 提供的默认方法来实现。

  • and(Predicate other): 返回一个新的 Predicate,它表示当前 Predicate 和另一个 Predicate 的逻辑与(AND)操作。
  • or(Predicate other): 返回一个新的 Predicate,它表示当前 Predicate 和另一个 Predicate 的逻辑或(OR)操作。
  • negate(): 返回当前 Predicate 的逻辑非(NOT)操作。

下面是一个使用组合 Predicate 的例子:

Predicate<Integer> isEven = num -> num % 2 == 0;
Predicate<Integer> isGreaterThan5 = num -> num > 5;

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

List<Integer> filteredNumbers = numbers.stream()
                                       .filter(isEven.and(isGreaterThan5))
                                       .collect(Collectors.toList());

在上述例子中,我们定义了两个 PredicateisEven 用于判断是否为偶数,isGreaterThan5 用于判断是否大于5。然后,我们使用 filter() 方法进行组合判断,并筛选出同时满足这两个条件的整数。

总结

Predicate 断言是 Java 1.8 引入的一个强大的函数式接口,它使得对集合元素进行条件筛选变得简单、优雅。通过实现 Predicate 接口的 test(T t) 方法,我们可以定义自己的条件判断逻辑,并在集合处理中使用 Predicate 进行筛选、过滤等操作。此外,我们还可以使用组合 Predicate 来实现多个条件的复合判断。