consumer 用于消费数据不返回值,核心方法 accept;predicate 用于条件判断返回布尔值,核心方法 test;二者按参数与返回值类型区分,不可混用。

Consumer 和 Predicate 是 Java 函数式编程中最常用、最基础的两个接口,它们分工明确:Consumer 负责“处理数据但不返回结果”,Predicate 负责“判断条件并返回布尔值”。用对了,代码立刻简洁清晰;用混了,逻辑容易出错或编译失败。
Consumer:专注执行,不求返回
它代表“消费行为”——接收一个参数,执行操作(比如打印、修改状态、写日志),但不返回任何值。核心方法是 accept(T t)。
- 典型场景:遍历集合时对每个元素做操作,如
list.forEach(System.out::println)中的System.out::println就是 Consumer - 常见写法:
- Lambda:
Consumer<string> printer = s -> System.out.println("处理:" + s);</string> - 方法引用:
Consumer<integer> logger = System.err::println;</integer> - 链式消费:
consumer.andThen(anotherConsumer)可顺序执行多个操作
- Lambda:
- 注意:不能用于需要返回值的地方(比如 Stream 的 map 或 filter),否则编译报错
Predicate:只做判断,返回 true 或 false
它代表“条件判断”——接收一个参数,返回 boolean,常用于过滤、校验、分支决策。核心方法是 test(T t)。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 典型场景:Stream 的
filter()方法必须传入 Predicate,例如list.stream().filter(x -> x > 10).collect(...) - 内置组合能力强大:
-
p1.and(p2)相当于&& -
p1.or(p2)相当于|| -
p1.negate()相当于!
-
- 可复用判断逻辑:把常用校验封装成 Predicate 变量,比如
Predicate<string> notEmpty = s -> s != null && !s.trim().isEmpty();</string>,后续多处调用
别混淆:看参数和返回值就能选对
记住这个判断依据,不用背名字:
- 只接收参数、不返回任何东西 → 用 Consumer
- 接收参数、只返回 true/false → 用 Predicate
- 如果需要返回非布尔值的结果(比如把 String 转成 Integer),那就该换 Function 了
- 如果完全不需要参数、只要一个结果(比如生成随机数),那就是 Supplier 的地盘
实战小提醒
Consumer 和 Predicate 都支持方法引用和 Lambda,优先用方法引用更简洁;写复合逻辑时,Predicate 的 and/or/negate 比嵌套 if 更易读、更安全;Consumer 的 andThen 在需要“先记录日志再更新状态”这类串行副作用时特别实用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










