Java 1.8 Predicate 断言函数式接口
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动
目前,
星球
内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4
,手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观
。
在 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());
在上述例子中,我们定义了两个 Predicate
:isEven
用于判断是否为偶数,isGreaterThan5
用于判断是否大于5。然后,我们使用 filter()
方法进行组合判断,并筛选出同时满足这两个条件的整数。
总结
Predicate
断言是 Java 1.8 引入的一个强大的函数式接口,它使得对集合元素进行条件筛选变得简单、优雅。通过实现 Predicate
接口的 test(T t)
方法,我们可以定义自己的条件判断逻辑,并在集合处理中使用 Predicate
进行筛选、过滤等操作。此外,我们还可以使用组合 Predicate
来实现多个条件的复合判断。