stream api 的核心是分离“要什么”和“怎么拿”,通过filter、map、sorted、collect等惰性操作链式处理数据,不修改原集合、不建临时列表,逻辑清晰高效。

Stream API 的核心不是“写得更短”,而是“想得更清”——它把“我要什么数据”和“怎么拿到它”彻底分开。一次链式调用就能完成过滤、映射、排序、归集整套动作,原始集合不动,中间不建临时列表,逻辑一气呵成。
过滤:先筛出真正关心的数据
filter 是第一个常用中间操作,接收一个 Predicate(比如 user -> user.getAge() >= 18),只留下满足条件的元素。它不执行、不改变原集合,只是标记“后面要处理哪些”。多个 filter 可以叠加,但建议把筛选效率高的条件放前面,比如先按 ID 范围过滤,再做字符串匹配,减少后续计算量。
- 避免在 filter 里写复杂业务逻辑,可提取为独立方法,提高可读性和复用性
- 注意 null 安全:若流中可能含 null,可用 Objects::nonNull 预检,或改用 Optional 处理
- filter 后不接终端操作(如 collect、forEach),整条链不会运行
映射:把数据换成你想要的样子
map 用于转换每个元素,比如从 User 对象提取 name 字符串,或把 int 列表转成其平方值。它的参数是 Function
- 如果元素本身是集合(如 List
- >),要用 flatMap 才能摊平成单层流
- map 中抛异常会中断整个流,需提前校验或用 try-catch 包裹逻辑
- 常见简写:String::length、User::getEmail、Integer::valueOf 等方法引用更简洁
排序:让结果按预期排列
sorted 是中间操作,支持自然顺序(.sorted())或自定义比较器。例如按年龄升序:Comparator.comparingInt(User::getAge);降序加 .reversed();多字段则用 .thenComparing(User::getName)。注意:sorted 是稳定排序,相同键值的相对顺序不变。
- 排序前最好确认字段非 null,否则抛 NullPointerException;可用 Comparator.nullsLast(Comparator.naturalOrder()) 容错
- 若仅需取 Top N,用 sorted + limit 比全量排序更高效
- 对基本类型(int/long/double),优先用 mapToInt 等专用流,避免装箱开销
归集:把流收口成你要的结果
collect 是最常用的终端操作,把流“收束”成集合、字符串、统计对象等。最常见的是 Collectors.toList() 或 Collectors.toSet()。它不止能收集,还能分组(groupingBy)、分区(partitioningBy)、拼接(joining)、求和求平均(summarizingInt)等。
- 若只需一个值(如最大年龄),直接用 max、min、count 更轻量,不必 collect 再 get
- 并发场景下可用 Collectors.toConcurrentMap,配合 parallelStream 提升吞吐
- 自定义收集器适合特殊聚合逻辑,但多数情况内置 Collectors 已覆盖主流需求
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











