Arrays.stream()将原始数组转为特化流(如IntStream)以支持高效聚合,引用数组则生成Stream需Collectors;误用int[]转Stream会编译失败,boxed()引发装箱开销应慎用。

Java 中 Arrays.stream() 是将原始数组(如 int[]、double[]、long[] 或引用类型数组)转为流的最直接方式,特别适合后续做声明式操作——比如过滤、映射、归约等。关键在于:原始类型数组会生成对应特化流(IntStream、DoubleStream 等),而非 Stream<integer></integer>,这直接影响方法可用性和性能。
区分原始类型与引用类型数组的 stream 创建方式
原始类型数组(int[]、long[]、double[])调用 Arrays.stream(arr) 会返回特化流,支持 sum()、average()、max() 等原生聚合方法;而引用类型数组(如 String[]、Person[])则返回 Stream<t></t>,需用 Collectors 进行聚合。
int[] nums = {1, 2, 3, 4, 5}; IntStream stream = Arrays.stream(nums);String[] names = {"Alice", "Bob", "Charlie"}; Stream<string> stream = Arrays.stream(names);</string>- 错误写法:
Stream<integer> s = Arrays.stream(new int[]{1,2,3});</integer>—— 编译失败,因int[]不是Integer[]
对原始数值流进行过滤与基础聚合
利用 IntStream 等特化流可高效完成常见数值计算,无需装箱,避免性能损耗。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 过滤偶数并求和:
int sumEven = Arrays.stream(nums).filter(n -> n % 2 == 0).sum(); - 求大于 2 的数的平均值(返回
OptionalDouble):double avg = Arrays.stream(nums).filter(n -> n > 2).average().orElse(0.0); - 找最大值(返回
OptionalInt):int max = Arrays.stream(nums).max().orElse(Integer.MIN_VALUE);
引用类型数组的过滤与归约操作
对于对象数组,流中元素即对象本身,可链式调用 filter、map,再通过 Collectors 实现灵活聚合。
立即学习“Java免费学习笔记(深入)”;
- 筛选长度大于 3 的字符串并拼接:
String joined = Arrays.stream(names).filter(s -> s.length() > 3).collect(Collectors.joining(", ")); - 统计满足条件的对象数量:
long count = Arrays.stream(people).filter(p -> p.getAge() >= 18).count(); - 按属性分组:
Map<integer list>> byAge = Arrays.stream(people).collect(Collectors.groupingBy(Person::getAge));</integer>
注意 boxed() 与装箱开销
若需对原始流使用泛型流方法(例如 Stream<integer>.mapToInt()</integer> 不可用时),可调用 boxed() 转为引用流,但会触发自动装箱,影响性能。
- 仅在必要时转换:
List<integer> list = Arrays.stream(nums).boxed().filter(x -> x > 0).collect(Collectors.toList());</integer> - 避免无谓装箱:求和、计数、极值等应优先使用特化流原生方法,而非先
boxed()再reduce -
IntStream.range(0, 1000000).boxed().mapToInt(Integer::intValue).sum()比直接IntStream.range(0, 1000000).sum()慢数倍

















