首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arrays.stream(数组) vs Arrays.asList(数组).stream()

Arrays.stream(数组) vs Arrays.asList(数组).stream()
EN

Stack Overflow用户
提问于 2016-05-16 19:07:53
回答 3查看 4.3K关注 0票数 11

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

代码语言:javascript
复制
Arrays.stream(scores)
        .forEach(System.out::println);

...but这不会:

代码语言:javascript
复制
Arrays.asList(scores).stream()
        .forEach(System.out::println);

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

EN

回答 3

Stack Overflow用户

发布于 2016-05-16 19:10:57

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

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

票数 17
EN

Stack Overflow用户

发布于 2016-05-16 19:12:03

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

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

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

票数 9
EN

Stack Overflow用户

发布于 2016-05-16 20:11:37

Arrays.asList需要对象数组,而不是基元数组。它在编译时不会出错,因为primitive数组是一个对象。

它可以接受一个对象作为列表,但不能将对象(原语数组是一个对象)中的内容转换为列表。

可以使用IntStreamDoubleStreamLongStream将原语数组转换为流

像这样

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37252468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档