java内置函数式接口用于简化集合操作、解耦逻辑、提升可读性;predicate用于条件过滤,function用于类型转换,consumer用于副作用操作,supplier用于延迟提供值,常组合使用。

Java 中内置函数式接口最常用于简化集合操作、解耦行为逻辑、提升代码可读性。它们不是“语法糖”,而是让数据处理意图更清晰的工具。
用 Predicate 做条件过滤
当你需要从列表中挑出满足特定条件的元素,比如找年龄大于18的用户、字符串含特定关键词、数值在某个区间内,Predicate 就是首选。
- 配合 Stream.filter() 使用,语义直接:“filter(isAdult)” 比写 for 循环加 if 判断更贴近业务意图
- 支持链式组合:isAdult.and(hasEmail).or(isVIP),逻辑组合一目了然
- 可复用:同一个 Predicate 实例能用在多个地方,比如同时用于校验和日志筛选
用 Function 做类型转换与映射
只要涉及“把一个东西变成另一个东西”,Function 就很自然。常见如字段提取、格式转换、对象构造。
- Stream.map() 的核心参数:把 User 映射成 String(getName)、把 String 映射成 Integer(parseInt)
- 支持链式处理:str -> str.trim().toUpperCase() 可封装为 Function
- 和 Optional 结合:optional.map(name -> "Mr. " + name) 避免空指针判断
用 Consumer 处理副作用操作
当你要对每个元素执行某个动作但不产生新结果——打印、存库、发消息、更新状态——Consumer 是标准选择。
- Stream.forEach() 的入参:System.out::println、user -> sendEmail(user) 都是典型 Consumer
- 避免在 forEach 里做复杂逻辑或修改外部变量;如需聚合,改用 collect 或 reduce
- 可组合:first.andThen(second),适合分步执行(如先记录日志再更新缓存)
用 Supplier 延迟提供值
Supplier 解决“什么时候创建”和“要不要创建”的问题,适用于默认值、单例获取、耗资源对象初始化等场景。
- 替代三元表达式中的 new 操作:orElseGet(() -> new ExpensiveObject()),避免无谓构造
- 配合 Optional 或重试逻辑:retry(() -> apiCall(), 3, () -> new RetryException())
- 生成测试数据:Supplier
- > mockUsers = () -> Arrays.asList(new User("A"), new User("B"))
这些接口不是孤立使用的,实际项目中往往组合出现:filter(Predicate).map(Function).forEach(Consumer),一条流就串起完整数据处理链条。关键不在记住接口名,而在理解“我要做什么”——是判断?转换?执行?还是生成?对应选哪个接口,就很自然了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











