如何通过方法生成指定长度的数组?
简而言之,此代码的优雅替换是什么:
Result generate() {
// logic
}
Result[] results(int length) {
Result[] results = new Result[length];
for (int i = 0; i < results.length; i++) results[i] = generate();
return results;
}
最佳答案
自 Java 8 起改为
for (int i = 0; i < results.length; i++) results[i] = generate();
你可以使用
Arrays.setAll(results, i -> generate());
您还可以删除显式生成new Result[length]
并让它由流处理
return IntStream.range(0, length).mapToObj(i->generate()).toArray(Result[]::new);
或者可能更具可读性(但正如 Brian Goetz 提到的:与 worse parallel performance 相比 range
版本)
return Stream.generate(this::generate).limit(length).toArray(Result[]::new);
<小时/>
但不要将 setAll(array, Generator)
与 fill(array, element)
方法混淆。 fill
将使用您传递的单个元素填充整个数组,而 setAll
将使用生成器为数组中的每个索引生成新元素。
示例:
static AtomicInteger ai = new AtomicInteger();
static int generate() {
return ai.incrementAndGet();
}
public static void main(String[] args) {
int[] result = new int[10];
Arrays.fill(result, generate());
System.out.println(Arrays.toString(result));
Arrays.setAll(result, i->generate());
System.out.println(Arrays.toString(result));
}
输出:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
关于java - 由方法生成的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089931/