Java Stream API的流处理逻辑按过滤、排序、规约顺序执行:filter筛选数据,sorted调整顺序,collect或reduce产出结果;中间操作惰性求值,终端操作触发执行。

Java Stream API 的流处理逻辑围绕排序、过滤与规约展开,三者不是并列关系,而是有明确执行顺序和职责分工的协作链:先过滤缩小数据范围,再排序调整顺序,最后规约(或归集)产出结果。
过滤:用 filter 精准筛出目标数据
filter 是中间操作,接收 Predicate
- 基础写法:如筛选偶数
stream().filter(n -> n % 2 == 0) - 对象筛选:如找年龄 ≥ 25 且姓名以 "A" 开头的用户
filter(u -> u.getAge() >= 25 && u.getName().startsWith("A")) - 空值防护:流中可能含 null 时,优先用
Objects::nonNull或在条件前判空,避免 NullPointerException - 性能提示:多个 filter 链式调用时,把选择性高、计算成本低的条件放前面,减少后续元素处理量
排序:用 sorted 控制输出次序
sorted 也是中间操作,支持自然顺序(如数字升序、字符串字典序)或自定义 Comparator。它不立即执行,但会影响最终结果顺序。
- 单字段升序:
.sorted(Comparator.comparing(User::getDept)) - 降序写法:
.sorted(Comparator.comparing(User::getSalary).reversed()) - 多级排序:先按部门升序,部门相同时按薪资降序
.sorted(Comparator.comparing(User::getDept).thenComparing(User::getSalary, Comparator.reverseOrder())) - null 安全:字段可能为 null 时,用
Comparator.nullsLast(Comparator.naturalOrder())显式约定 null 排在末尾
规约:用 collect 或 reduce 落地最终结果
规约是终端操作,必须放在链尾,触发整个流水线执行。collect 更常用,reduce 更底层;两者都不可重复调用。
立即学习“Java免费学习笔记(深入)”;
- 转成新容器:
.collect(Collectors.toList())、.collect(Collectors.toSet()) - 分组统计:
.collect(Collectors.groupingBy(User::getGender))返回 Map<K, List<V>> - 聚合计算:
.count()、.max(Comparator.naturalOrder())、.collect(Collectors.averagingDouble(User::getSalary)) - 自定义规约:如拼接字符串
.collect(Collectors.joining(", ")),或用reduce实现累乘等逻辑 - 关键约束:Stream 只能消费一次,collect 执行后流即关闭;中间操作全部延迟执行,无终端操作则无实际运算
不复杂但容易忽略:filter、sorted 这类中间操作本身不做事,只有遇到 collect、count、forEach 等终端操作时,整条链才真正跑起来。写的时候看着是“一行代码”,背后是声明式逻辑+惰性求值的组合。


















