【问题标题】:Elegant way to combine two arrays pairwise in Java 8在 Java 8 中成对组合两个数组的优雅方式
【发布时间】:2017-12-22 22:21:12
【问题描述】:

我喜欢通过 BiFunction 成对组合两个通用数组。在这里你可以看到简单的实现:

<A,B,C> C[] combine(A[] as, B[] bs, BiFunction<A,B,C> op) {
    if (as.length == bs.length) {
        C[] cs = (C[]) new Object[as.length];
        for(int i = 0; i < as.length; i++) {
            cs[i] = op.apply(as[i], bs[i]);
        }
        return cs;
    } else {
        throw new IllegalArgumentException();
    }
}

我想知道是否有更优雅的方法可以在没有 for 循环的情况下执行此操作 - 也许使用 Java 8 Stream。我会很高兴收到您的建议。

【问题讨论】:

  • 虽然 Aominè 提供了基于流的循环版本,但我认为它并不优雅。但是,如果您在.range(..) 之后添加.parallel(),它会打开并行处理的可能性,因此在多处理器环境中使用这种方法可能会更好。
  • 可以使用Guava的Streams.zip()
  • 你不应该压制那个警告,顺便说一句。它迟早会在你的脸上炸开。
  • 抑制异常的另一种方法是为方法提供IntFunction&lt;C[]&gt;,并使用它来创建数组。

标签: java arrays java-8 java-stream


【解决方案1】:

你可以使用Arrays.setAll方法:

C[] cs = (C[]) new Object[as.length];
Arrays.setAll(cs, i -> op.apply(as[i], bs[i]));

或者,如果op 的计算成本很高,您也可以使用Arrays.parallelSetAll

【讨论】:

    【解决方案2】:

    您可以使用IntStream.range 生成索引,然后对其进行操作。

    C[] cs = (C[])IntStream.range(0, as.length)
                           .mapToObj(i -> op.apply(as[i], bs[i]))
                           .toArray();
    

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 2011-01-20
      • 1970-01-01
      • 2021-11-30
      • 2016-06-28
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多