java stream api的核心价值是用声明式链式调用替代传统循环,提供不修改原集合、不存储数据的“数据流水线”;通过数据源创建流,经filter/map/flatmap等中间操作处理,再以collect/count/foreach等终端操作收尾,且流只能使用一次。

Java Stream API 的核心价值在于用声明式链式调用替代传统循环,让集合处理更直观、更少出错。它不改变原集合,也不存储数据,只是一条“数据流水线”——你告诉它“要什么结果”,而不是“怎么一步步算”。掌握几个关键操作,就能覆盖绝大多数日常需求。
怎么拿到一个 Stream?
流必须从数据源出发,常见方式有:
- 集合直接调用 .stream():List、Set、Map 的 keySet() 或 entrySet() 都支持
- 数组用 Arrays.stream(arr):注意 int[] 等基本类型数组要用对应方法(如 IntStream)
- 零散值用 Stream.of(a, b, c):适合写测试或临时构造数据
- 文件行用 Files.lines(path):一行就是一个字符串元素
过滤和转换是高频动作
真正干活靠中间操作,它们不执行,只搭管道:
-
filter(Predicate):按条件筛,比如
stream.filter(u -> u.getAge() >= 18) -
map(Function):改形状,比如
stream.map(User::getName)提姓名,或map(s -> s.toUpperCase())转大写 -
flatMap(Function):拆嵌套,比如部门列表 → 所有员工:
depts.stream().flatMap(d -> d.getUsers().stream()) -
distinct():去重,依赖对象的
equals()和hashCode()
怎么收尾?终端操作决定结果形态
一旦调用终端操作,整条流水线才真正跑起来:
-
collect(Collectors.toList()):最常用,转回 List;也可用
toSet()、toMap() - count():返回 long 类型总数
- forEach(Consumer):遍历执行副作用(如打印、入库),但不生成新集合
-
reduce():聚合计算,比如求和:
stream.reduce(0, Integer::sum) - anyMatch()/allMatch():做布尔判断,短路执行,效率高
别忘了流只能用一次
Stream 是一次性消费品。执行完 collect() 或 forEach() 后再调用就会抛 IllegalStateException。如果需要多次使用,要么重新创建流,要么把结果存为集合再操作。并行流(parallelStream())虽能提速,但要注意共享变量线程安全,小数据量反而可能更慢。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











