2017-12-22 1 views
5

私はBiFunctionで2つのジェネリックアレイをペアで組み合わせたいと思っています。ここでは、素朴な実装を参照してください。forループせずにこれを行うには、よりエレガントな方法があるかどう2つの配列をJavaでペアで組み合わせる優雅な方法8

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

のだろうか - 多分Java 8 Streamで。私はあなたの提案に満足しています。

+3

Aominèはストリームベースのループを提供していましたが、よりエレガントではないと思います。しかし、 '.range(..)'の後ろに '.parallel()'を追加すると並列処理が可能になりますので、そのアプローチを使うとマルチプロセッサ環境のほうが良いかもしれません。 – Pshemo

+2

Guavaの['Streams.zip()'](https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Streams.html#zip-java)を使用できます。 .util.stream.Stream-java.util.stream.Stream-java.util.function.BiFunction-)。 – shmosel

+2

あなたはその警告を抑制してはいけません、btw。遅かれ早かれあなたの顔に爆破する縛りがあります。 – shmosel

答えて

5

3

IntStream.rangeを使用してインデックスを生成し、それを操作することができます。

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

あるいは、opは計算が非常に高価であるならば、あなたもArrays.parallelSetAllを使用することができます:あなたはArrays.setAllメソッドを使用することができます

C[] cs = (C[])IntStream.range(0, as.length) 
         .mapToObj(i -> op.apply(as[i], bs[i])) 
         .toArray(); 
関連する問題