predicate是java 8的函数式接口,用于判断对象是否满足条件并返回boolean,提供and(短路与)、or(短路或)、negate等默认方法,支持链式组合条件,常用于stream.filter()。

Predicate 是 Java 8 引入的函数式接口,用于表示“判断某个对象是否满足特定条件”,返回 boolean。它自带 and、or、negate 等默认方法,方便链式组合多个条件。
and:同时满足多个条件
and 方法接收另一个 Predicate,返回一个新的 Predicate,其逻辑是“当前条件 && 另一个条件”。短路求值:如果第一个条件为 false,第二个不会执行。
示例:
Predicate<integer> isEven = x -> x % 2 == 0; Predicate<integer> isPositive = x -> x > 0; Predicate<integer> evenAndPositive = isEven.and(isPositive); System.out.println(evenAndPositive.test(4)); // true(偶数且正数) System.out.println(evenAndPositive.test(-2)); // false(负数,isPositive 先 false,isEven 不执行) </integer></integer></integer>
or:满足任一条件即可
or 方法也接收另一个 Predicate,返回新 Predicate,逻辑为“当前条件 || 另一个条件”。同样短路:第一个为 true 时,第二个不执行。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
示例:
Predicate<string> startsWithA = s -> s.startsWith("A");
Predicate<string> endsWithZ = s -> s.endsWith("Z");
Predicate<string> aOrZ = startsWithA.or(endsWithZ);
System.out.println(aOrZ.test("Apple")); // true(startsWithA 为 true,endsWithZ 不执行)
System.out.println(aOrZ.test("Buzz")); // true(endsWithZ 为 true)
System.out.println(aOrZ.test("Hello")); // false
</string></string></string>
组合多个条件的常见写法
可以连续调用 and 或 or,也可混用(注意优先级:and 优先级高于 or,类似 && 高于 ||)。
- 多个
and连接:推荐从左到右链式调用,语义清晰 - 混用时建议加括号明确逻辑,避免歧义
- 实际使用中常配合
Stream.filter()
例如:
List<person> people = ...;
Predicate<person> adult = p -> p.getAge() >= 18;
Predicate<person> inBeijing = p -> "Beijing".equals(p.getCity());
Predicate<person> hasJob = p -> p.getJob() != null;
// 找北京的成年人且有工作
people.stream()
.filter(adult.and(inBeijing).and(hasJob))
.collect(Collectors.toList());
// 找北京人或上海人(注意:需分别构造再 or)
Predicate<person> inShanghai = p -> "Shanghai".equals(p.getCity());
people.stream()
.filter(inBeijing.or(inShanghai))
.collect(Collectors.toList());
</person></person></person></person></person>
注意事项
-
and和or返回的是**新 Predicate**,原对象不变,线程安全 - 空值处理:若传入的 Predicate 为
null,会抛NullPointerException,调用前建议判空 - 嵌套过深可能影响可读性,复杂逻辑建议提取为具名变量或独立方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










