方法生成的数组

Array generated by a method

如何通过方法生成指定长度的数组?

简而言之,什么是此代码的优雅替换:

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);

或可能更具可读性(但与 range 版本相比 Brian Goetz mentioned: with worse parallel performance

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]