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

时间:2016-05-16 11:07:53

标签: java arrays foreach java-8 java-stream

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

Arrays.stream(scores)
        .forEach(System.out::println);

......但这不是:

Arrays.asList(scores).stream()
        .forEach(System.out::println);

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

3 个答案:

答案 0 :(得分:15)

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

如果您将Integer[]更改为Arrays.asList(scores),您将获得预期的输出(即List<Integer>将返回brew install mysql )。

答案 1 :(得分:8)

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

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

事实上,效率是原始数组具有stream重载的原因。您的来电Arrays.stream(scores)将路由至stream(int[] array),生成IntStream个对象。现在,您可以应用.forEach(System.out::println),再次调用println(int),再次避免装箱。

答案 2 :(得分:0)

Arrays.asList 期望Object的数组不是基元的数组。 它不会在编译时抱怨,因为基元数组是一个对象。

它可以将一个对象作为列表,但对象(基元数组是对象)内部的内容无法转换为列表。

基元的数组可以使用转换为流 IntStreamDoubleStreamLongStream

像这样

double[] doubleArray = {1.1,1.2,1.3};

DoubleStream.of(doubleArray).forEach(System.out::println);


int[] intArray = {1,2,3,4,5,6};

IntStream.of(intArray).forEach(System.out::println);


long[] longArray = {1L,2L,3L};

LongStream.of(longArray).forEach(System.out::println);