Java 1.8 Predicate 断言函数式接口
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 54w+ 字,讲解图 2476+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1900+ 小伙伴加入学习 ,欢迎点击围观
在 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
来实现多个条件的复合判断。