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

ic3*_*ic3 8 java java-8 java-stream

从Java 8开始,所以需要一点时间来适应它.这是一个经典问题,我想要转换一系列对象.

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

P[] outputArray = new P[inputArray.length];
for (int i =0; i< inputArray.length; i++ )
{
    outputArray [i] = inputArray[i].transformToP();
}
Run Code Online (Sandbox Code Playgroud)

Java8中最好的版本是什么?

Tag*_*eev 12

使用Stream API非常简单:

P[] outputArray = Arrays.stream(inputArray).map(e -> e.transformToP()).toArray(P[]::new);
Run Code Online (Sandbox Code Playgroud)

也可以使用方法引用(假设这I是输入元素的类型):

P[] outputArray = Arrays.stream(inputArray).map(I::transformToP).toArray(P[]::new);
Run Code Online (Sandbox Code Playgroud)

请注意,如果transformToP()方法抛出已检查的异常,则可能会出现问题.在这种情况下,将它们转换为未经检查的或咨询问题.

  • 如果你更喜欢`Arrays.stream(inputArray)`,还有一个`Stream.of(inputArray)`. (3认同)
  • @Keppil,是的,我想这是风格问题. (3认同)

Stu*_*rks 7

Tagir Valeev的答案中描述了在数组上使用流是一种很好的技术.但是,别忘了Arrays.setAll.这是一个方便的快捷方式,可以根据索引设置数组的所有元素.要通过某个函数将数组转换为新数组,您可以这样做:

P[] outputArray = new P[inputArray.length];
Arrays.setAll(outputArray, i -> inputArray[i].transform());
Run Code Online (Sandbox Code Playgroud)

您不必将其复制到新数组中.如果要在适当的位置转换数组,可以这样做:

Arrays.setAll(array, i -> array[i].transform());
Run Code Online (Sandbox Code Playgroud)

还有一个平行的变化parallelSetAll.

在封面下,这仅仅是IntStream.range输入数组的索引,但有时候对于快速的单行程来说很方便.