java函数式接口核心是解决四类行为模式:consumer执行无返回操作,predicate判断真假,function转换输入输出,supplier无参供给值。

理解 Java 函数式接口,关键不是背定义,而是抓住“它要解决什么问题”——每个接口都对应一种最常见、最纯粹的行为模式。Consumer、Predicate、Function、Supplier 这四个不是并列的工具,而是分工明确的角色:一个管“干”,一个管“判”,一个管“转”,一个管“给”。用对了,代码逻辑一目了然;混用了,反而绕弯。
Consumer:只管“执行”,不图“返回”
它代表一种副作用行为:接收一个值,做点事(比如打印、存库、发消息),但不产出新值。核心方法是 accept(T),语义就是“我收下这个,然后处理它”。
- 典型场景:遍历集合时逐个处理元素,如
list.forEach(System.out::println) - 可链式组合:用
andThen()把多个操作串起来,比如先记录日志再更新状态 - 注意:它不关心结果,所以不能用于需要返回值的地方,比如 map 或 filter
Predicate:专做“是或否”的判断
它不改变数据,也不生成新值,只回答一个问题:“这个条件成立吗?” 返回 true 或 false。核心方法是 test(T)。
- 典型场景:Stream 的
filter(),比如stream.filter(s -> s.length() > 3) - 支持逻辑组合:
and()、or()、negate(),避免嵌套 if - 有基本类型特化版,如
IntPredicate,避免装箱开销
Function:专注“输入→输出”的转换
它把一个值变成另一个值,比如 String 转 Integer,User 转 UserDto。核心方法是 apply(T),泛型定义为 Function<t r></t>。
- 典型场景:Stream 的
map(),如list.stream().map(String::length) - 支持链式处理:
andThen()(先 A 再 B)、compose()(先 B 再 A) -
Function.identity()是恒等函数,适合占位或类型适配
Supplier:无参“供给”一个值
它不依赖外部输入,只负责“生产”一个结果。核心方法是 get(),没有参数,只有返回值。
- 典型场景:延迟初始化、随机数生成、读配置、
Optional.orElseGet(Supplier) - 天然适合惰性求值:get() 调用时才真正执行,避免不必要的计算
- 没有入参,意味着线程安全(只要内部逻辑本身是安全的)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











