为什么使用Arrays.stream和Stream.of处理基础类型数组得到的结果不同?
Java Stream两种int数组处理方式结果差异的根因
两段代码的底层执行逻辑差异
- 第一段代码
Arrays.stream(num)Arrays类针对基础类型数组提供了专属重载方法Arrays.stream(int[] array),该方法会直接返回IntStream类型的流,流中元素就是传入int数组的每一个int值,因此统计元素总数得到的是数组长度4。 - 第二段代码
Stream.of(num)Stream.of()的入参为泛型对象类型,有两个常用重载:Stream.of(T t):接收单个对象,返回仅包含该对象的流Stream.of(T... values):接收多个对象/对象数组,返回包含所有数组元素的流
你传入的int[]属于基本类型数组,本身是一个引用类型对象,不属于对象数组,因此JVM会匹配第一个重载,把整个int数组当作单个元素存入流中,此时流的泛型为Stream<int[]>,总元素数自然为1。
扩展:使用Stream.of()得到相同结果的方案
如果要让Stream.of()统计得到4,有两种实现方式:
- 将基本类型int数组替换为包装类型Integer数组:
此时Integer num[] = {1,2,3,4}; System.out.println(Stream.of(num).count()); // 输出4Stream.of()会匹配对象数组的可变参数重载,流中包含4个Integer元素。 - 对基本类型数组的流做扁平化处理:
System.out.println(Stream.of(num).flatMapToInt(arr -> Arrays.stream(arr)).count()); // 输出4
内容的提问来源于stack exchange,提问作者Saipriyadarshini Bandi
相关产品推荐
相关产品推荐

