java stream api 的核心是分离“要什么结果”和“怎么拿到它”,通过链式调用实现过滤、转换、聚合,原始集合不变、无临时列表、逻辑清晰高效。

Java Stream API 的核心是把“要什么结果”和“怎么拿到它”分开。一次链式调用就能完成过滤、转换、聚合整套动作,原始集合不动,中间不建临时列表,逻辑清晰高效。
多条件过滤:先筛出真正关心的数据
filter 是第一个常用中间操作,接收 Predicate(比如 user -> user.getAge() >= 18 && user.isActive()),只留下满足条件的元素。它不执行、不改变原集合,只是构建处理规则。
- 多个 filter 可叠加,但建议把筛选效率高的条件放前面,例如先按 ID 范围过滤,再做字符串匹配,减少后续计算量
- 流中可能含 null?可用 Objects::nonNull 预检,或配合 Optional 处理
- filter 后不接终端操作(如 collect、forEach),整条链不会运行——这是惰性求值的关键体现
数据转换:把原始结构变成你需要的样子
map 用于逐个转换元素,输入一个类型,输出另一个类型。常见场景不是直接处理数字,而是面对字符串、日期、嵌套对象等原始形式。
- 提取字段:users.stream().map(User::getName)
- 结构重塑:orders.stream().flatMap(order -> order.getItems().stream()).map(Item::getSkuId)
- 避免装箱开销:对数值型字段,优先用 mapToInt(Order::getQuantity),可直接调用 sum()、average() 等原生方法
- 多级转换可链式组合:filter → map → mapToInt,中间操作只构建管道,不触发执行
聚合统计:一步到位生成最终结果
聚合是流处理的终点目标,必须由终端操作触发。它不返回 Stream,而是具体结果,比如 Map、List、Long 或 int。
- 基础统计:numbers.stream().mapToInt(Integer::intValue).sum() 或 list.stream().collect(Collectors.counting())
- 分组计数:collect(Collectors.groupingBy(p -> p.getEventDate().getMonth(), Collectors.counting()))
- 复合分组(如按年月+事件类型):需自定义键类(如 MonthState),再用 groupingBy(Function.identity(), Collectors.counting())
- 归约复杂逻辑:reduce 可实现加权平均等,但多数业务推荐语义更清晰的 collect + 预置收集器
全流程协作:清洗→转换→聚合闭环
真实业务很少只做单一动作。典型流程是:先过滤无效数据,再构造分组键,最后聚合并转为 DTO 输出。
- 过滤无效数据:filter(p -> p.getEventDate() != null && p.getEvent() != null)
- 构造分组键:map(p -> new MonthState(p.getEventDate().getYear(), p.getEventDate().getMonthValue(), p.getEvent()))
- 聚合计数并结构化:collect(Collectors.groupingBy(Function.identity(), Collectors.counting())),再遍历 Map 构建响应列表
- 写法简洁不等于无脑链式——注意原始类型流(mapToInt)对 GC 的友好性,大数据量下效果明显
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











