java - 由方法生成的数组

标签 java arrays coding-style

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

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

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/

相关文章:

c++ - 如何返回一维大小未知的二维数组?

c# - 私有(private)成员是否应该在惯用的 C# 中明确声明为私有(private)成员?

java - Bean 验证不适用于 spring webflux

java - 如何使用 Ganymed SSH-2 启用完整日志记录

arrays - 使用 Rust 创建自定义类型 bytes32 作为 32 位宽的字节数组

java - "Identifier expected"将ArrayList的元素添加到Array时出错

java - java中的空白窗口

java - 从其自己的目录运行 ant 文件

objective-c - 压缩代码有什么好处吗?

scala - Scala 方法 def 什么时候应该使用显式定义的返回类型?