在this问题中,已经回答了这两个表达式是相等的,但在这种情况下,它们会产生不同的结果。对于给定的int[] scores,为什么会这样:
Arrays.stream(scores)
.forEach(System.out::println);...but这不会:
Arrays.asList(scores).stream()
.forEach(System.out::println);据我所知,.stream()可以在任何集合上调用,列表绝对是。第二个代码片段只返回一个包含整个数组的流,而不是元素。
发布于 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>)。
发布于 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),再次避免装箱。
发布于 2016-05-16 20:11:37
Arrays.asList需要对象数组,而不是基元数组。它在编译时不会出错,因为primitive数组是一个对象。
它可以接受一个对象作为列表,但不能将对象(原语数组是一个对象)中的内容转换为列表。
可以使用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);https://stackoverflow.com/questions/37252468
复制相似问题