bipredicate用于接收两个参数并返回布尔值,适合校验二者逻辑关系,支持泛型、lambda表达式、方法引用及and/or/negate组合,需注意边界与可读性。

BiPredicate 用于接收两个参数并返回布尔值,适合校验两个参数之间的逻辑关系,比如“是否相等”“是否满足大小约束”“是否互为正负数”等。
常见校验场景与写法
BiPredicate
- 检查两个字符串是否长度相等:
BiPredicate<string string> sameLength = (a, b) -> a.length() == b.length();</string> - 判断整数 a 是否能被 b 整除(注意 b ≠ 0):
BiPredicate<integer integer> divisible = (a, b) -> b != 0 && a % b == 0;</integer> - 验证用户年龄和入职年份是否合理(如入职时需满18岁):
BiPredicate<integer integer> validAgeAndYear = (age, year) -> age >= 18 && (LocalDateTime.now().getYear() - year) </integer>
结合 Stream 或 Collection 做批量校验
可配合 Stream.allMatch() 或 anyMatch() 对成对数据做断言:
- 检查一组坐标点是否都满足“x 小于 y”:
List<pair integer>> points = ...; boolean allXLessThanY = points.stream().allMatch(p -> xLessThanY.test(p.x, p.y));</pair> - 用
Map.entrySet()校验 key 和 value 关系:map.entrySet().stream().allMatch(e -> notNullAndNotEmpty.test(e.getKey(), e.getValue()));
复用与组合逻辑
BiPredicate 支持 and()、or()、negate() 方法,便于组合多个条件:
- 同时满足“非空”且“长度相等”:
BiPredicate<string string> bothNonEmptyAndSameLen = nonNull.and(sameLength);</string> - 允许其中一个是 null,但不能都为 null:
BiPredicate<string string> atLeastOneNonNull = nonNull.or((a,b) -> a != null || b != null).negate();</string>(更推荐直接写(a,b) -> a != null || b != null)
注意边界与可读性
避免在 lambda 中写复杂逻辑;必要时提取为具名方法,提升可读性和可测试性:
- 不推荐:
(a, b) -> a != null && b != null && a.startsWith(b) && a.length() - b.length() - 推荐封装:
BiPredicate<string string> isValidPrefix = this::isValidPrefixWithMaxLength;</string>,然后在私有方法里实现细节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











