Java Stream API 通过 filter、map、reduce 三步实现流式数据处理:filter 精准筛选、map 转换形态、reduce 归约结果,典型链式调用如统计十月销售总额。

Java Stream API 的流式计算天然契合 Map-Reduce 模型,它把数据处理拆解为清晰、可组合的三步:筛选(Filter)、转换(Map)、聚合(Reduce)。这种结构不是硬性流程,而是逻辑分层——你按需选用,顺序也灵活,但典型路径就是先筛再转后聚。
Filter:精准定位目标数据
Filter 是中间操作,用于保留满足条件的元素,不匹配的被丢弃。它不改变元素本身,只做“减法”。
- 写法简洁:用 Lambda 表达式或方法引用传入谓词(Predicate),例如 sales.stream().filter(s -> s.date().getMonth() == Month.OCTOBER)
- 注意惰性求值:filter 不会立刻执行,只有遇到终止操作(如 reduce、collect)时才真正触发
- 可链式叠加:比如同时过滤十月且金额大于5的记录:.filter(s -> s.date().getMonth() == Month.OCTOBER).filter(s -> s.amount() > 5)
Map:完成数据形态转换
Map 把每个元素映射为另一个值,实现“一对一”变换。它常用来提取字段、格式化、类型转换等。
- 基础 map() 返回新 Stream,类型可变:如 .map(Sale::product) 得到 String 流
- 数值计算推荐专用方法:避免装箱开销,用 mapToInt(Sale::amount) 直接生成 IntStream
- flatMap 用于“一对多”展开:比如把 List
转成所有单词组成的 Stream,适合嵌套结构扁平化
Reduce:归约为单一结果
Reduce 是终止操作,把流中所有元素通过二元操作合并成一个值,本质是累积计算。
立即学习“Java免费学习笔记(深入)”;
- 三种常用重载形式:
- reduce(BinaryOperator):返回 Optional,空流时需判空(如 .reduce(Integer::max))
- reduce(identity, BinaryOperator):带初始值,流为空也安全(如 .reduce(0, Integer::sum))
- reduce(identity, BiFunction, BinaryOperator):支持并行流的复杂归约(如字符串拼接)
- 常见用途:求和、求积、找最值、拼接字符串、构建自定义对象等
- 注意线程安全:在并行流中,使用带 combiner 的版本才能正确合并各线程结果
组合起来:一条链搞定完整逻辑
Map-Filter-Reduce 不是必须严格按此顺序,但典型业务场景(如统计某类销售额)自然形成这个链条。以十月销售总额为例:
int total = sales.stream()
.filter(s -> s.date().getMonth() == Month.OCTOBER)
.mapToInt(Sale::amount)
.sum();
这行代码背后是:构造流 → 筛出十月记录 → 提取金额为 int 流 → 累加得总数。每一步语义明确,无临时变量,也无需手动循环。


















