2017-12-22 296 views
5

ile birleştirmenin zarif yolu İki genel diziyi BiFunction ile birleştirmek istiyorum. Burada naif uygulanmasını bkz:İki diziyi 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(); 
    } 
} 

Ben bir for döngüsü olmadan bunu yapmak için daha şık bir yol olup olmadığını merak - belki Java 8 Stream ile. Önerilerinden memnun olurum.

+3

Aominè, döngünüzün akışa dayalı sürümünü sağlamasına rağmen, daha zarif olduğunu düşünmüyorum. Ama '.parallel()' yi '.range (..)' dan sonra eklerseniz, bu işlemin kullanılması çok-işlemcili ortamlarda daha iyi olabilir. – Pshemo

+2

Guava'nın ['Streams.zip()'] sayfasını kullanabilirsiniz (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

Bu uyarıyı bastırmamalısınız, btw. Er ya da geç yüzünüzde havaya uçmak zorunda. – shmosel

cevap

3

, endeksleri oluşturmak için IntStream.range'u kullanabilir ve daha sonra kullanabilirsiniz. op hesaplamak çok pahalı olmadığını da Arrays.parallelSetAll kullanabilirsiniz,

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

Veya:

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