【问题标题】:Array generated by a method方法生成的数组
【发布时间】:2015-06-27 14:44:03
【问题描述】:

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

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

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:return IntStream.range(0, length).mapToObj(i -&gt; generate()).toArray(Result[]::new);。它是否更具可读性/优雅取决于读者。
  • @david.lucky 我正在寻找 Pshemo 发布的确切内容。

标签: java arrays coding-style


【解决方案1】:

从 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 performancerange 版本相比)

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]

【讨论】:

  • 在我看来,您的第一个建议是最好的。
  • @RedRoboHood 我也喜欢它,但我不确定 OP 正在寻找什么方法,所以我添加了更多选项。
猜你喜欢
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2011-06-11
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多