Java Stream API的中间操作是链式调用基石,不执行计算只定义行为,需终止操作触发;核心包括筛选(filter/distinct/limit/skip)、映射(map/flatMap/peek)、排序(sorted)及数值优化(mapToInt等)类操作。

Java Stream API 的中间操作是链式调用的基石,它们不执行计算,只定义“要做什么”,真正执行必须靠终止操作触发。掌握哪些是中间操作、各自语义和典型使用场景,是面试中考察底层理解的关键。
核心筛选与截取类操作
这类操作用于缩小数据范围,逻辑清晰、高频实用:
-
filter(Predicate):按条件保留元素。注意它不改变元素本身,只做布尔判断;常与 null 安全配合,比如
s -> s != null && s.length() > 0 -
distinct():基于
equals()和hashCode()去重。对自定义对象需确保这两个方法正确重写,否则去重失效 -
limit(n) 和 skip(n):组合使用可实现分页,如
stream.skip((page-1)*size).limit(size);但注意 limit 在大数据量下不能替代数据库分页,因仍需遍历前 n 项
元素映射与结构转换类操作
负责类型或结构层面的变换,是流式处理“加工”环节的核心:
-
map(Function):一对一转换,如
String::length、User::getName;返回新 Stream,原元素不受影响 - flatMap(Function<T, Stream<R>>):一对多展开再扁平化,典型用于处理嵌套集合(如 List<List<String>> → Stream<String>)或字符串拆分;错误用 map 替代 flatMap 是常见误区
- peek(Consumer):主要用于调试,在不改变流的前提下观察每个元素(如打印日志),生产环境慎用,因其副作用不符合函数式理念
排序与有序性控制类操作
影响流中元素顺序,部分操作有性能代价,需结合实际权衡:
立即学习“Java免费学习笔记(深入)”;
-
sorted():无参时按自然序排序,要求元素实现
Comparable;有参时传Comparator,支持逆序、多字段等复杂逻辑 - sorted(Comparator) 是稳定排序,相同元素相对位置不变;但它是全量排序,大数据流慎用,可考虑先 filter 再 sorted 优化
其他实用中间操作
补充性但不可替代的操作,解决特定场景问题:
-
mapToInt/mapToLong/mapToDouble:避免装箱开销,对数值计算更高效;例如统计总和时,
stream.mapToInt(Integer::intValue).sum()比map(i->i).reduce(0, Integer::sum)更快 - sequential() 和 parallel():虽不常显式调用,但需知道默认是串行流;并行流适用于 CPU 密集型、无状态操作,且源数据需支持高效分割(如 ArrayList)


















