函数式接口(如Predicate)不直接执行条件,而是封装可复用的条件判断逻辑,供if、filter等调用;Predicate<T>接收参数返回boolean,支持组合(and/or/negate)、流式过滤及与Consumer配合实现条件触发行为。

函数式接口本身不直接“执行条件”,而是提供一种灵活、可复用的方式来封装和传递条件判断逻辑。真正的条件执行仍由 if、三元运算符或流式操作(如 filter)触发,而函数式接口(尤其是 Predicate)负责定义“什么算满足条件”。关键在于把“判断标准”从硬编码中解耦出来,变成可注入、可组合、可测试的行为单元。
Predicate 封装条件判断
Predicate<T> 是实现条件逻辑最自然的函数式接口:它接收一个参数,返回 boolean,语义就是“这个对象是否符合某条件”。你可以把它看作一个可复用的“判断器”。
- 直接定义简单条件: Predicate<String> isLongerThan5 = s -> s != null && s.length() > 5;
- 组合多个条件: Predicate<Integer> isEven = n -> n % 2 == 0;
Predicate<Integer> isPositive = n -> n > 0;
Predicate<Integer> isValid = isEven.and(isPositive); // 同时满足 - 传给 filter 使用: List<String> longNames = names.stream().filter(isLongerThan5).collect(Collectors.toList());
结合 if/else 或三元运算符做分支决策
当需要根据条件结果走不同业务路径时,Predicate 可作为判断依据,配合传统控制流使用,让条件逻辑更清晰:
- 用 Predicate 替代冗长表达式:if (isValid.test(user.getId())) { ... } else { ... } 比 if (user.getId() != null && user.getId() > 0 && !bannedIds.contains(user.getId())) 更易读、可复用。
- 用在三元运算符中: String status = isActive.test(user) ? "在线" : "离线";
Consumer + Predicate 实现条件性副作用
如果条件满足后要执行某个动作(比如发通知、记录日志),可以用 Predicate 判断 + Consumer 执行,形成“条件触发行为”的模式:
立即学习“Java免费学习笔记(深入)”;
- 封装条件动作对:public static <T> void when(Predicate<T> condition, Consumer<T> action, T input) {
if (condition.test(input)) action.accept(input);
} - 调用示例:when(s -> s.length() > 10, s -> System.out.println("超长字符串:" + s), text);
避免常见误区
别把函数式接口当成流程控制语法糖。它解决的是“逻辑在哪里定义、如何复用”,不是替代 if 的执行机制:
- 不用 Function 做判断:Function 必须返回值,Predicate 才是专为 true/false 设计的接口。
- 不把复杂分支逻辑全塞进 Lambda:Predicate 应保持纯判断,动作逻辑交给 Consumer 或独立方法。
- @FunctionalInterface 注解不是必须的,但强烈建议加上,让编译器帮你检查是否真只有一个抽象方法。


















