Java Stream API 核心依赖 Predicate、Function、Consumer 三大函数式接口:Predicate 用于条件筛选(test),Function 用于类型转换(apply),Consumer 用于无返回值的副作用操作(accept),三者均单抽象方法、支持链式组合、提升代码可读性与复用性。

Java Stream API 的核心能力,依赖于几个轻量又精准的函数式接口——Predicate、Function 和 Consumer。它们不是工具类,而是行为契约:每个接口只定义一个抽象方法,明确“做什么”和“怎么收尾”,让 filter、map、forEach 等操作可读、可组合、可复用。
Predicate:专做判断,返回 true 或 false
它对应的是“条件筛选”场景,方法是 test(T t),输入一个值,输出一个布尔结果。Stream 的 filter() 就靠它工作。
- 判断字符串非空且长度大于3:
Predicate<string> valid = s -> s != null && s.length() > 3;</string> - 组合多个条件更自然:用
and()、or()、negate()链式调用,比如isEven.and(x -> x > 0).negate()表示“非正偶数” - 避免空指针:可配合
Objects::nonNull或自定义安全判断,比如Predicate.ofNullable()(部分工具库提供)或手动判空
Function:专注转换,把一种类型变成另一种
它解决“数据变形”问题,方法是 apply(T t),接收一个参数,返回另一个类型的结果。Stream 的 map() 就基于它。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 常见转换如
String::length、s -> Integer.parseInt(s)、User::getName - 支持链式处理:用
andThen()把多个 Function 串起来,比如先转大写再取子串:String::toUpperCase.andThen(s -> s.substring(0, 5)) - 注意异常:Lambda 内若抛出受检异常(如 ParseException),需自行 try-catch 或封装成 RuntimeException,否则编译不通过
Consumer:只负责消费,不返回任何东西
它用于“执行副作用”,方法是 accept(T t),输入一个值,做完事就结束——没有返回值。Stream 的 forEach() 和 peek() 都接受 Consumer。
立即学习“Java免费学习笔记(深入)”;
- 典型用途包括打印日志、存入集合、更新状态:
System.out::println、list::add、user -> user.setActive(true) - 组合多个动作:用
andThen()顺序执行,比如先保存再发通知:save.andThen(notify) - 注意线程安全:在并行流中使用 Consumer 修改共享变量(如普通 ArrayList)可能出错,建议改用线程安全容器或收集到不可变结构中

















