工作,并围绕此进行测试后最好的选择我来了:
IntStream.range(0, array.length).forEach(x -> Arrays.setAll(array[x], y -> builder.build2Dobject(x, y)));
(在我提出的特定情况下,它是:
IntStream.range(0, array.length).forEach(x -> Arrays.setAll(array[x], y -> String.format("%c%c", letter(x), letter(y)));
的3D阵列,它只是:
IntStream.range(0, array.length).forEach(x -> IntStream.range(0, array[x].length).forEach(y -> Arrays.setAll(array[x][y], z -> builder.build3Dobject(x, y, z))));
这是让程序选择最快选项的代码:
public static void fill2DArray(Object[][] array, Object2DBuilderReturn builder){
int totalLength = array.length * array[0].length;
if (totalLength < 200){
for(int x = 0; x < array.length; x++){
for (int y = 0; y < array[x].length; y++){
array[x][y] = builder.build2Dobject(x, y);
}
}
} else if (totalLength >= 200 && totalLength < 1000){
IntStream.range(0, array.length).forEach(x -> Arrays.setAll(array[x], y -> builder.build2Dobject(x, y)));
} else {
IntStream.range(0, array.length).forEach(x -> Arrays.setAll(array[x], y -> builder.build2Dobject(x, y)));
}
}
功能接口:
@FunctionalInterface
public interface Object2DBuilderReturn<T> {
public T build2Dobject(int a, int b);
}
不是非常重要,但我认为你的意思'数组[X] .length'为内循环。 – 2014-09-26 04:22:20
是的,我绝对没有 – 2014-09-28 17:48:08
只需使用标准的for-loop。你的代码对读者来说简单明了。像流解决方案一样优雅,我不认为它在这里增加了任何东西。 – 2014-10-02 07:14:19