【发布时间】: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<C[]>,并使用它来创建数组。
标签: java arrays java-8 java-stream