2017-12-22 7 views
5

두 개의 일반 배열을 BiFunction으로 쌍으로 결합하는 것을 좋아합니다. 여기서 당신은 순진 구현을 참조하십시오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

답변

3

IntStream.range을 사용하여 색인을 생성 한 다음이를 조작 할 수 있습니다. op는 계산이 매우 비싼 경우도 Arrays.parallelSetAll을 사용할 수 있습니다,

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

또는 :

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