Java8-转换数组元素的最佳方法

Java8-转换数组元素的最佳方法,java,java-8,java-stream,Java,Java 8,Java Stream,从Java8开始,需要一点时间来适应它。这是一个经典的问题,我有一组我想要变换的对象 在Java8之前,理想的代码是(没有空指针): P[]outputArray=新的P[inputArray.length]; for(int i=0;iarray[I].transform());)。已经有一个clone()方法可以直接在数组类型中使用。为什么不添加更多与数组相关的方法,而不是混乱数组类?原语专门化将仅位于相应的原语数组类型中。嗯,这可能需要对语言进行重大修改,但这会使代码更加清晰。javac可

从Java8开始,需要一点时间来适应它。这是一个经典的问题,我有一组我想要变换的对象

在Java8之前,理想的代码是(没有空指针):

P[]outputArray=新的P[inputArray.length];
for(int i=0;i

Java8中最好的版本是什么?

使用流API非常简单:

P[] outputArray = Arrays.stream(inputArray).map(e -> e.transformToP()).toArray(P[]::new);
也可以使用方法引用(假设
I
是输入元素的类型):


请注意,如果
transformToP()
方法抛出选中的异常,您可能会遇到问题。在本例中,将它们转换为未选中的,或咨询问题。

使用数组上的流是一种很好的技术,如中所述。但是,不要忘记
数组。setAll
。这是一个方便的快捷方式,用于根据索引设置数组的所有元素。要通过某些函数将数组转换为新数组,可以执行以下操作:

P[] outputArray = new P[inputArray.length];
Arrays.setAll(outputArray, i -> inputArray[i].transform());
Arrays.setAll(array, i -> array[i].transform());
您不必将其复制到新数组中。如果要就地变换阵列,可以执行以下操作:

P[] outputArray = new P[inputArray.length];
Arrays.setAll(outputArray, i -> inputArray[i].transform());
Arrays.setAll(array, i -> array[i].transform());
还有一个并行变体
parallelSetAll


在封面下,这只是一个
IntStream.range
在输入数组的索引上,但有时对于快速的一行程序来说非常方便。

请看,如果你喜欢
Stream.of(inputArray)
而不是
Arrays.Stream(inputArray)
@Keppil,是的,我想这是风格的问题。添加得不错,向上投票。虽然OP的
transformToP
表明
outputArray
类型
P
不同于
inputArray
类型。顺便说一下,使用类似于
Arrays.replaceAll(array,fn)
的东西非常有用,它传递给
fn
的不是数组索引,而是当前值,因此您可以编写
Arrays.replaceAll(array,P::transform)@TagirValeev谢谢。实际上,
数组
中“缺少”了很多有用的东西。问题是,
数组
已经太杂乱了,任何添加都意味着添加子范围变体和原语专门化。我明白了。我总是想知道是否可以直接将这些方法添加到数组类型中(使用类似于
array.setAll(I->array[I].transform());
)。已经有一个
clone()
方法可以直接在数组类型中使用。为什么不添加更多与数组相关的方法,而不是混乱
数组
类?原语专门化将仅位于相应的原语数组类型中。嗯,这可能需要对语言进行重大修改,但这会使代码更加清晰。javac可能只是将此类调用转换为静态方法调用。@TagirValeev已知问题::-)不幸的是,数组的
clone()
方法和
length
字段在该语言中的情况非常特殊。有一些想法让数组实现一些接口,所以这些东西将被显式声明,甚至可能被扩展。请参阅John Rose在会议上的“Arrays 2.0”演讲。但是请注意,尽管其中一些是原型化的,但据我所知,没有一个是用于JDK 9的。不错的一个,因为它创建的对象较少(是的,是的,有时很重要)