从Java 8开始,所以需要一点时间来适应它。这是一个经典问题,我有一个对象数组,我想要变换。
在Java8之前,理想的代码是(没有空指针):
P[] outputArray = new P[inputArray.length];
for (int i =0; i< inputArray.length; i++ )
{
outputArray [i] = inputArray[i].transformToP();
}
Java8中最好的版本是什么
使用Stream API非常简单:
P[] outputArray = Arrays.stream(inputArray).map(e -> e.transformToP()).toArray(P[]::new);
也可以使用方法引用(假设I
是输入元素的类型):
P[] outputArray = Arrays.stream(inputArray).map(I::transformToP).toArray(P[]::new);
注意,如果transformToP()
方法抛出检查异常,您可能会遇到问题。在这种情况下,将它们转换为未选中的,或者参考这个问题。
在数组上使用流是Tagir Valeev的回答中描述的一种很好的技术。然而,不要忘记Arrays.setAll
。这是一个方便的快捷方式,可以根据索引设置数组的所有元素。要通过某个函数将一个数组转换为一个新数组,您可以这样做:
P[] outputArray = new P[inputArray.length];
Arrays.setAll(outputArray, i -> inputArray[i].transform());
你不需要把它复制到一个新的数组中。如果您想就地转换数组,您可以这样做:
Arrays.setAll(array, i -> array[i].transform());
也有一个平行变化parallelSetAll
。
实际上,这只是输入数组索引上的IntStream.range
,但对于快速的一行程序来说,它有时非常方便。