在this问题中,已经回答说两个表达式都是相同的,但在这种情况下它们会产生不同的结果。对于给定的int[] scores
,为什么这样做:
Arrays.stream(scores)
.forEach(System.out::println);
......但这不是:
Arrays.asList(scores).stream()
.forEach(System.out::println);
据我所知.stream()
可以在任何Collection上调用,列表肯定是。第二个代码片段只返回一个包含整个数组的流而不是元素。
答案 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的数组不是基元的数组。 它不会在编译时抱怨,因为基元数组是一个对象。
它可以将一个对象作为列表,但对象(基元数组是对象)内部的内容无法转换为列表。
基元的数组可以使用转换为流
IntStream
,DoubleStream
和LongStream
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);