Java 8原始流到集合映射方法

Tom*_*mas 5 java integer java-8 java-stream

这两种流创建方法之间是否存在任何显着差异(性能或最佳实践)?

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

Arrays.stream(arr2)
      .map((in)->in*2)
      .mapToObj((in) -> new Integer(in))
      .collect(Collectors.toCollection(()-> new ArrayList<>()));

Arrays.stream(arr2)
      .map(in->in*2)
      .boxed()
      .collect(Collectors.toCollection(()-> new ArrayList<>()));
Run Code Online (Sandbox Code Playgroud)

编辑

感谢Stack Community的答案,我可以为新读者添加一些问题完整性的插件:

正如许多人所指出的,.boxed()IntStream方法定义为:

@Override
    public final Stream<Integer> boxed() {
        return mapToObj(Integer::valueOf);
    }
Run Code Online (Sandbox Code Playgroud)

什么基本上重新定义了以下哪一个更好的问题:

.mapToObj(in -> new Integer(in))
Run Code Online (Sandbox Code Playgroud)

要么

.mapToObj(in -> Integer.valueOf(in))
Run Code Online (Sandbox Code Playgroud)

Tom*_*ski 7

是的,boxed()用于从缓存中Integer.valueOf检索某些Integer实例的用途.

所以你应该使用boxed()(最好)版本,或使用Integer.valueOf而不是new Integer().请注意,这boxed()实际上是简写mapToObj(Integer::valueOf).


Bor*_*der 5

第二个更好,因为Integer在此示例中它不创建任何对象。

JLS 5.1.7开始

如果要装箱的值p是-128至127(含)之间的int ...,则令r1和r2是p的任何两次装箱转换的结果。r1 == r2总是这样。

一般来说,您不应调用new包装器类型,而应使用其static工厂方法-例如Integer.valueOf