Stream API 是 Java 8 引入的函数式数据处理工具,支持链式调用 filter/map/reduce/flatMap 等操作,具备惰性求值特性,需终止操作触发执行,且不可重复使用。

Stream API 是 Java 8 引入的核心特性之一,它让集合数据的处理更简洁、更声明式,也更容易并行化。相比传统 for 循环或增强 for 循环,Stream 不是替代集合本身,而是提供一种“对数据进行函数式操作的管道”。
用 filter + map 替代遍历筛选与转换
传统写法常需新建集合、手动循环、条件判断、再添加元素;Stream 可以链式表达意图:
-
// 传统方式
List<String> names = new ArrayList<>();
for (User u : users) {
if (u.getAge() > 18) {
names.add(u.getName().toUpperCase());
}
} -
// Stream 方式(一行逻辑,清晰可读)
List<String> names = users.stream()
.filter(u -> u.getAge() > 18)
.map(u -> u.getName().toUpperCase())
.collect(Collectors.toList());
用 reduce 实现聚合计算,避免手写累加逻辑
求和、拼接、找最大值等聚合操作,不再需要定义临时变量和循环更新:
-
// 求所有用户年龄总和
int sum = users.stream().mapToInt(User::getAge).sum(); -
// 自定义聚合:拼接非空用户名,用逗号分隔
String joined = users.stream()
.map(User::getName)
.filter(Objects::nonNull)
.reduce("", (a, b) -> a.isEmpty() ? b : a + "," + b);
用 flatMap 处理嵌套结构,扁平化一步到位
当每个元素关联一个集合(如用户有多个订单),传统做法需双重循环;flatMap 能自然展开:
-
// 获取所有用户的全部订单 ID 列表
List<Long> allOrderIds = users.stream()
.flatMap(u -> u.getOrders().stream())
.map(Order::getId)
.collect(Collectors.toList());
注意终止操作与惰性求值,避免空指针或重复执行
Stream 是惰性的:只有遇到 终止操作(如 collect、forEach、count、findFirst)才会真正执行。中间操作(filter、map 等)只是组装流水线。
- 多次调用同一个 Stream 会抛 IllegalStateException,需重新获取或转为集合缓存;
- 若源集合含 null 元素,filter 前建议先用 Objects::nonNull 过滤,或在 map 中做空安全处理;
- 简单遍历推荐用 forEach,但注意它不保证顺序(并行流下);如需有序处理,用 forEachOrdered。
















