java stream中间操作的核心是返回新stream、不触发计算、支持链式调用;筛选切片类(filter/distinct/limit/skip)缩小数据范围,映射类(map/flatmap/peek)转换或展开元素,排序类(sorted/unordered)调整顺序,并发优化需注意副作用与性能。

Java Stream API 的中间操作不是“多写几个方法就行”,关键在于理解它们的共性:返回新 Stream、不触发计算、支持链式调用。真正出错,往往是因为没意识到它们只是“搭管道”,还没通水。
筛选与切片类:按条件选或截数据
这类操作用于缩小数据范围,不改变元素本身形态。
-
filter:保留满足 Predicate 条件的元素。例如
stream.filter(s -> s.length() > 2)留下长度超 2 的字符串;注意空指针风险,建议提前判空或用Objects.nonNull包裹。 -
distinct:基于
equals()和hashCode()去重。对自定义对象需重写这两个方法,否则只比较引用。 -
limit(n) 和 skip(n):配合使用可实现分页,如
skip((page-1)*size).limit(size);但要注意,它们不保证性能——底层仍可能遍历前面所有元素(尤其在未排序流中)。
映射类:转换元素形态或结构
核心是把一个元素变成另一个值,或展开成多个元素。
-
map:一对一转换,比如
stream.map(String::toUpperCase)或map(person -> person.getName())。输入输出类型可不同,但每个输入严格对应一个输出。 -
flatMap:一对多展开再扁平化。典型场景是处理嵌套集合,如
List<list>></list>→Stream<string></string>;常见误用是拿map替代flatMap,结果得到Stream<list>></list>,无法直接遍历字符串。 - peek:主要用于调试,在不中断流的前提下执行消费动作(如打印日志),不影响后续操作;正式环境慎用,避免副作用干扰逻辑。
排序与去序类:调整元素顺序或解除约束
排序是稳定操作,但代价较高;去序则用于优化并行场景。
-
sorted():无参时按自然序,有参时传
Comparator。注意:对未实现Comparable的对象必须提供比较器,否则运行时报ClassCastException。 -
sorted(Comparator):支持链式定制,如
sorted(comparing(String::length).reversed())先按长度再倒序。 -
unordered():显式声明流不要求顺序,可提升
distinct、limit等操作在并行流中的性能;但若后续依赖顺序(如findFirst),就不该加。
其他实用中间操作
这些操作用途明确,容易被忽略但很关键。
-
takeWhile 和 dropWhile(Java 9+):按条件从头截取或跳过连续段。例如
takeWhile(n -> n 在 <code>[1,2,3,6,4]中只取[1,2,3](遇到 6 就停)。 -
concat:合并两个流,注意它是个静态方法
Stream.concat(s1, s2),不挂在实例上。 - parallel() 和 sequential():切换流的执行模式,影响后续所有操作;多次调用以最后一次为准。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











