Arrays.stream(array)vs Arrays.asList(array).stream()

AdH*_*nem 9 java arrays foreach java-8 java-stream

这个问题中,已经回答说两个表达式都是相同的,但在这种情况下它们会产生不同的结果.对于给定的int[] scores,为什么这有效:

Arrays.stream(scores)
        .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

......但这不是:

Arrays.asList(scores).stream()
        .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

据我所知,.stream()可以在任何Collection上调用,列表肯定是.第二个代码片段只返回一个包含整个数组的流而不是元素.

Era*_*ran 16

您看到的行为并非特定于Streams. 传递给它时Arrays.asList(scores)返回a ,因为泛型类型参数不能被基本类型替换.因此,当您调用时,编译器将使用代替.List<int[]>int[]asList(T... a)int[]T

如果scores改为Integer[],你将得到你期望的输出(Arrays.asList(scores)即将返回a List<Integer>).

  • @AdHominem那不行,因为你不能将数组传递给`ArrayList`构造函数.您只能传递一个集合. (3认同)

das*_*ght 8

第二个代码片段不起作用的原因是List<int>Java中没有这样的东西.这就是为什么Arrays.asList(scores)没有产生你期望的.

切换int[]Integer[]将解决这个问题,因为这两个代码会产生相同的结果.但是,您的代码效率会降低,因为所有ints都会被装箱.

事实上,效率是stream原始数组过载的原因.您的呼叫Arrays.stream(scores)被路由到stream(int[] array),生成IntStream对象.现在,你可以申请.forEach(System.out::println),其中要求println(int),又避免了拳击.