Java中Predicate接口的and()和or()是逻辑组合默认方法,非语法运算符;and要求所有条件为真,or只需任一为真,均支持短路执行与链式调用,并可结合negate()实现否定逻辑。

Java 中函数式接口通过 and 和 or 组合,主要指 Predicate<T> 接口提供的默认方法 and() 与 or()。它们不是语法运算符(如 &&、||),而是面向对象的逻辑组合方式,用于构建可复用、可链式调用的条件判断逻辑。
Predicate 的 and() 组合:所有条件都必须成立
调用 predicate1.and(predicate2) 会返回一个新的 Predicate,它仅在两个原始谓词同时返回 true 时才返回 true,等价于逻辑“与”。
- 执行顺序:先执行
predicate1.test(x),再执行predicate2.test(x);若任一为false,短路返回false - 适合场景:多条件联合校验,比如“字符串非空且长度大于5”
- 示例:
Predicate<String> nonEmpty = s -> s != null && !s.trim().isEmpty(); Predicate<String> longEnough = s -> s.length() > 5; Predicate<String> valid = nonEmpty.and(longEnough); System.out.println(valid.test("HelloWorld")); // true System.out.println(valid.test("Hi")); // false(长度不够)
Predicate 的 or() 组合:任一条件成立即可
调用 predicate1.or(predicate2) 返回新谓词,只要其中任意一个返回 true,结果即为 true,等价于逻辑“或”。
- 执行顺序:先执行
predicate1.test(x);若为true,直接返回,不执行predicate2(短路) - 适合场景:宽松匹配,比如“是管理员 或 属于白名单用户”
- 示例:
Predicate<Integer> isAdmin = id -> id == 1; Predicate<Integer> isWhitelisted = id -> List.of(101, 102, 103).contains(id); Predicate<Integer> allowed = isAdmin.or(isWhitelisted); System.out.println(allowed.test(1)); // true(admin) System.out.println(allowed.test(102)); // true(whitelist) System.out.println(allowed.test(99)); // false
组合可嵌套,支持链式调用
and 和 or 可连续调用,形成复杂条件表达式,语义清晰且避免深层 if 嵌套。
立即学习“Java免费学习笔记(深入)”;
- 注意优先级:方法调用从左到右,
a.and(b).or(c)等价于(a ∧ b) ∨ c,不是a ∧ (b ∨ c) - 如需改变逻辑顺序,可用括号风格封装,例如:
Predicate<String> startsWithA = s -> s.startsWith("A"); Predicate<String> endsWithZ = s -> s.endsWith("Z"); Predicate<String> containsNum = s -> s.matches(".*\d+.*"); // 表达:(以A开头 且 以Z结尾) 或 包含数字 Predicate<String> complex = startsWithA.and(endsWithZ).or(containsNum);
搭配 negate() 实现“非”逻辑
and/or 常与 negate() 配合使用,实现类似 “不属于A 且 属于B” 的否定组合。
-
predicate.negate()返回一个反转结果的新谓词 - 示例:排除黑名单 + 保留活跃用户
Predicate<String> blacklisted = s -> Set.of("user1", "user3").contains(s); Predicate<Boolean> isActive = active -> Boolean.TRUE.equals(active); Predicate<String> acceptable = blacklisted.negate().and(isActive::equals);


















