java stream api提供声明式、函数式数组/集合处理方式,支持惰性求值的流管道操作;基本类型数组用arrays.stream(),引用类型推荐arrays.stream();可链式调用filter、map、reduce、collect等实现过滤、映射、聚合与收集。

Java Stream API 提供了一种声明式、函数式的方式来处理数组(或集合),让遍历、过滤、映射、聚合等操作更简洁、可读性更强。它不改变原数组,而是生成一个流管道进行惰性求值,适合处理中等规模数据的转换与分析任务。
将数组转为Stream进行基础遍历
原始数组(如 int[]、String[])不能直接调用 stream() 方法,需借助 Arrays.stream() 或 Stream.of():
- 基本类型数组(如 int[]、double[]):用 Arrays.stream(array),返回的是 IntStream、DoubleStream 等特化流,避免装箱开销。
- 引用类型数组(如 String[]、Person[]):可用 Arrays.stream(array) 或 Stream.of(array),两者效果一致,但 Arrays.stream 更推荐(语义更明确)。
示例:
String[] names = {"Alice", "Bob", "Charlie"};
Arrays.stream(names)
.forEach(System.out::println); // 输出每项(注意:forEach 是终端操作,触发执行)
过滤与条件筛选(filter + predicate)
使用 filter() 配合 Lambda 表达式,按业务逻辑保留符合条件的元素:
- 字符串数组中筛选长度大于 3 的名字:filter(name -> name.length() > 3)
- int 数组中筛选偶数:Arrays.stream(nums).filter(n -> n % 2 == 0)
- 支持链式调用,多个 filter 可组合(等价于 && 逻辑)。
注意:filter 不修改原数组,只生成新流;空结果不会报错,后续操作(如 findFirst)会返回 Optional.empty。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
映射转换与数据加工(map / mapToInt 等)
map() 用于一对一转换,常用于格式调整、对象提取或计算:
- String[] → 转为大写:map(String::toUpperCase)
- Person[] → 提取姓名列表:map(Person::getName)
- int[] → 转为平方值流:mapToObj(x -> x * x) 或直接用 map(x -> x * x)(返回 IntStream)
区分 map、mapToInt、mapToLong、mapToDouble:根据目标流类型选择,避免不必要的装箱,提升性能。
聚合统计与结果收集(reduce / collect / toArray)
遍历后常需汇总结果,Stream 提供多种终端操作:
- reduce:做累积计算,如求和、拼接、找最大值。例如:Arrays.stream(nums).reduce(0, Integer::sum)
- collect:灵活收集到容器,常用 Collectors.toList()、toSet()、joining()、groupingBy() 等。例如:collect(Collectors.joining(", ")) 将字符串数组拼成逗号分隔串。
- toArray:还原为数组,如 toArray(String[]::new)(必须提供构造器引用)。
注意:collect 和 toArray 是常见终点,适合需要具体结果的场景;而 forEach 仅用于副作用(如打印、写日志),不适合返回值收集。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










