Arrays.stream(array)和Arrays.asList(array).stream()的区别

11
这个问题中已经回答了两种表达式是相等的,但在这种情况下它们产生不同的结果。对于给定的int[] scores,为什么这个可以工作:
Arrays.stream(scores)
        .forEach(System.out::println);

...但这并不会:

Arrays.asList(scores).stream()
        .forEach(System.out::println);
据我所知,.stream() 可以调用任何集合,其中包括列表。第二个代码片段仅返回包含整个数组而不是元素的流。

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

3个回答

17
您看到的行为并非特定于Stream。 当您传递一个int[]时,Arrays.asList(scores)返回一个List<int[]>,因为泛型类型参数无法用基本类型替换。因此,当您调用asList(T... a)时,编译器会在T的位置上使用int[]
如果您将scores更改为Integer[],则会得到您期望的输出(即Arrays.asList(scores)将返回一个List<Integer>)。

我明白了。只是奇怪,因为我记得过去我做过这样的事情而且它能够工作。如果我事先声明List会有效吗,就像这样:List<Integer> scoresAsList = new ArrayList<>(scores); - AdHominem
4
由于您无法将数组传递给ArrayList构造函数,因此这是行不通的。您只能传递一个Collection。 - Eran
顺便提一下,Stream.of(scores).forEach(System.out::println);Arrays.asList(scores).stream().forEach(System.out::println);的作用是相同的... - Holger

9
第二段代码无法正常工作的原因是Java中不存在List<int>。这就是为什么Arrays.asList(scores)无法生成您期望的结果。
int[]更改为Integer[]可以解决此问题,因为两个代码片段将产生相同的结果。但是,您的代码效率会降低,因为所有的 int都要装箱。
事实上,效率是存在基本数组重载的stream方法的原因。您的调用Arrays.stream(scores)被路由到stream(int[] array),从而产生IntStream对象。现在,您可以应用.forEach(System.out::println),它调用println(int),再次避免了装箱。

1
祈求项目瓦尔哈拉的顺利完成吧 :D - java8.being
@java8.being:由于编写一个int[]的包装器List大约需要十行代码,而对于流式处理,Arrays.stream(scores)已经可以工作,我不认为有必要为我们甚至不知道这个问题将如何改变而祈求某些东西... - Holger
@Holger 我的意思是这行代码:第二个代码片段无法工作的原因是在Java中没有List<int>这样的东西。 - java8.being
如果Valhalla项目能够改变这一点,那么List<int>List<@NonNull Integer>之间将没有真正的区别,而Arrays.asList将继续以兼容性为原因执行其当前操作... - Holger

1

Arrays.asList期望的是对象数组而不是基本类型数组。

它在编译时不会报错,因为基本类型数组也是一个对象。

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

基本类型数组可以使用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);

我的答案有什么问题吗?至少你应该评论一下。 - Noor Nawaz
当然有帮助,int[] score 怎样转换成 stream。 - Noor Nawaz
现在好多了 +1 - Hulk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接