作者:f蓝色基因__987 | 来源:互联网 | 2022-11-23 11:37
这两种流创建方法之间是否存在任何显着差异(性能或最佳实践)?
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<>()));
编辑
感谢Stack Community的答案,我可以为新读者添加一些问题完整性的插件:
正如许多人所指出的,.boxed()
IntStream方法定义为:
@Override
public final Stream boxed() {
return mapToObj(Integer::valueOf);
}
什么基本上重新定义了以下哪一个更好的问题:
.mapToObj(in -> new Integer(in))
要么
.mapToObj(in -> Integer.valueOf(in))
Tomasz Linko..
7
是的,boxed()
用于从缓存中Integer.valueOf
检索某些Integer
实例的用途.
所以你应该使用boxed()
(最好)版本,或使用Integer.valueOf
而不是new Integer()
.请注意,这boxed()
实际上是简写mapToObj(Integer::valueOf)
.
1> Tomasz Linko..:
是的,boxed()
用于从缓存中Integer.valueOf
检索某些Integer
实例的用途.
所以你应该使用boxed()
(最好)版本,或使用Integer.valueOf
而不是new Integer()
.请注意,这boxed()
实际上是简写mapToObj(Integer::valueOf)
.
2> Boris the Sp..:
第二个更好,因为Integer
在此示例中它不创建任何对象。
从JLS 5.1.7开始
如果要装箱的值p是-128至127(含)之间的int ...,则令r1和r2是p的任何两次装箱转换的结果。r1 == r2总是这样。
一般来说,您不应调用new
包装器类型,而应使用其static
工厂方法-例如Integer.valueOf