stream api的核心价值在于通过声明式链式操作将集合数据转换为所需变量,无需手动循环和临时变量;支持集合、数组、字符串转流,经中间操作定义转换逻辑,再由终端操作生成单值、集合或判断结果。

Stream API 的核心价值,就在于把集合数据“走管道”变成变量——不是靠循环和临时变量拼凑,而是用声明式链路一步到位。关键不在写得多,而在选对中间操作和终端操作的组合。
从集合出发,快速获取流
几乎所有集合都能直接转 Stream:
-
List、Set、Queue:调用
.stream()(顺序)或.parallelStream()(并行) -
数组:用
Arrays.stream(arr)或Stream.of(e1, e2, ...) -
字符串:
str.chars()得IntStream,或str.split(" ").stream()
用中间操作搭好转换逻辑
这步不执行,只定义“要怎么变”。常见高效组合:
- 过滤再提取:
filter(Objects::nonNull).map(Person::getAge) - 去重+排序+截取前3:
distinct().sorted(Comparator.reverseOrder()).limit(3) - 扁平化嵌套:
flatMap(list -> list.stream())把List<list>></list>拉平
终端操作决定最终变量类型
只有这时才真正跑数据,结果直接是你要的变量:
- 聚合为单值:
.reduce(0, Integer::sum)→int;.max(Comparator.naturalOrder())→Optional<t></t> - 收集为集合:
.collect(Collectors.toList())→List<t></t>;.collect(Collectors.toMap(User::getId, User::getName))→Map<k></k> - 判断型结果:
.anyMatch(s -> s.length() > 10)→boolean;.findFirst()→Optional<t></t>
实战小例子:从用户列表拿到平均年龄(double)、最年长者姓名(String)、活跃用户ID列表(List)
一段代码同时产出三个变量:
List<user> users = ...;
double avgAge = users.stream()
.filter(User::isActive)
.mapToInt(User::getAge)
.average()
.orElse(0.0);
String eldestName = users.stream()
.filter(User::isActive)
.max(Comparator.comparing(User::getAge))
.map(User::getName)
.orElse("N/A");
List<long> activeIds = users.stream()
.filter(User::isActive)
.map(User::getId)
.collect(Collectors.toList());
</long></user>
注意:虽然用了三次 stream(),但每次都是独立流水线。若想单次遍历完成多结果,需用 Collectors.teeing()(Java 12+)或自定义收集器。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











