java 8 stream api 实现声明式过滤,filter() 接收 predicate 返回新 stream,支持链式组合与短路终止操作,需搭配 map 和 collect 完成筛选→转换→收集流程,注意空值防护、函数纯净性及性能适用场景。

Java 8 引入的 Stream API 让集合数据过滤从“怎么做”转向“要什么”,真正实现声明式编程——你只需描述目标,不用操心遍历、条件判断、结果收集等细节。
用 filter() 描述过滤逻辑
filter() 是最核心的过滤方法,接收一个 Predicate(布尔表达式),只保留满足条件的元素。它不修改原集合,而是返回新 Stream。
- 写法简洁:比如筛选年龄大于18的用户,users.stream().filter(u -> u.getAge() > 18)
- 支持链式组合:可连续调用多个 filter,如先按年龄再按状态筛选:.filter(u -> u.getAge() >= 18).filter(u -> u.isActive())
- 注意短路行为:filter 本身不短路,但配合 findFirst() 或 anyMatch() 等终止操作时,Stream 会自动提前停止遍历
结合 map 和 collect 完成完整流程
单纯 filter 只是中间操作,必须搭配终端操作才能执行。常见组合是 filter → map → collect,完成“筛选→转换→收集成结果”的声明式链条。
- 例如获取所有活跃用户的姓名列表:users.stream()
.filter(u -> u.isActive())
.map(User::getName)
.collect(Collectors.toList()) - collect() 是最常用的终端操作,支持转为 List、Set、Map(用 Collectors.toMap)、字符串(Collectors.joining)等多种形式
- 避免在 filter 中做复杂计算或副作用操作(如修改外部变量、打印日志),保持函数式纯净性
处理空值与复杂条件
真实业务中常遇到 null 值或嵌套对象判断,Stream 本身不自动判空,需主动防护。
- 对可能为 null 的字段,用 Objects.nonNull() 或 Optional 配合:.filter(Objects::nonNull).filter(u -> u.getAddress() != null && u.getAddress().getCity().equals("Beijing"))
- 多条件组合推荐提取为独立 Predicate,提升可读性与复用性:Predicate
isAdult = u -> u.getAge() >= 18;
PredicateisInBeijing = u -> "Beijing".equals(u.getCity());
users.stream().filter(isAdult.and(isInBeijing)).collect(...) - 若需按不同规则分组过滤,可用 partitioningBy 或 groupingBy 替代多次 filter
性能与使用边界提醒
Stream 并非万能,理解其适用场景才能用得恰当。
- 小数据量或简单循环时,传统 for 循环可能更直观、调试更方便
- 并行流(parallelStream)适合 CPU 密集型、无状态、可分割的大数据处理,但要注意线程安全和副作用风险
- 避免在 filter 中调用远程接口或数据库查询——Stream 是为内存数据设计的,IO 操作应前置或封装
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











