predicate、function、consumer、supplier是java函数式编程四大核心接口:predicate做布尔判断,function负责类型转换,consumer执行无返回消费操作,supplier提供无参值生成。

这四个接口是 Java 函数式编程的骨架,各自承担明确职责,不重叠、不模糊——用对了,代码更简洁;用错了,逻辑就容易绕弯。
Predicate:专做“是或否”的判断
它只干一件事:接收一个参数,返回 true 或 false。不修改数据,也不产生新值,纯粹用于条件筛选或校验。
- 常见于 Stream 的 filter() 方法,比如
list.stream().filter(s -> s.length() > 5) - 支持逻辑组合:
pred1.and(pred2)(且)、pred1.or(pred3)(或)、pred1.negate()(非),避免层层嵌套 if - 基本类型有对应变体,如
IntPredicate、LongPredicate,省去装箱开销
Function:负责“输入→输出”的类型转换
它把一个值变成另一个值,比如 String 转 Integer、User 转 UserDto,核心是 apply(T) 方法。
- 泛型定义为
Function<t r></t>,T 是入参类型,R 是返回类型 - 支持链式处理:
func1.andThen(func2)表示先执行 func1,再把结果传给 func2;func1.compose(func2)则反过来 -
Function.identity()返回恒等函数,常用于无需转换但类型需匹配的场景
Consumer:专注“用了就完事”的消费动作
它接收一个参数,执行操作,但不返回任何结果。典型用途是打印、存库、发消息等副作用行为。
- 方法名是 accept(T),语义清晰:参数被“接受”并处理
- 常配合 forEach() 使用,比如
stream.forEach(System.out::println) - 提供 andThen(Consumer) 方法,可顺序执行多个消费动作,比如先记录日志再更新状态
Supplier:无中生有地“供给”一个值
它不收参数,只负责“生产”一个结果,适合封装创建逻辑、延迟计算或获取外部资源。
- 核心方法是 get(),调用即返回,比如生成随机数、读配置、取当前时间戳
- 常用于 Optional.orElseGet(Supplier)、Stream.generate(Supplier) 等需要按需生成值的场景
- 没有输入依赖,天然适合惰性求值和并发安全的简单构造











