2017-12-22 139 views
5

Tôi muốn kết hợp hai mảng chung theo cặp theo một số BiFunction. Ở đây bạn thấy việc thực hiện ngây thơ:Cách thanh lịch để kết hợp hai mảng theo cặp trong 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(); 
    } 
} 

Tôi tự hỏi nếu có một cách thanh lịch hơn để làm điều này mà không có một cho vòng - có lẽ với Java 8 Stream. Tôi sẽ hạnh phúc về đề xuất của bạn.

+3

Trong khi Aominè cung cấp phiên bản dựa trên luồng của vòng lặp của bạn, tôi không nghĩ nó thanh lịch hơn. Nhưng nó mở ra khả năng xử lý song song nếu bạn thêm '.parallel()' sau '.range (..)' để sử dụng cách tiếp cận đó có thể tốt hơn trong môi trường đa xử lý. – Pshemo

+2

Bạn có thể sử dụng ['Streams.zip()'] của Guava (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

Bạn không nên kìm nén cảnh báo đó, btw. Nó sắp bị thổi vào mặt bạn sớm hay muộn. – shmosel

Trả lời

5

Bạn có thể sử dụng phương pháp Arrays.setAll:

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

Hoặc, nếu op là rất tốn kém để tính toán, bạn cũng có thể sử dụng Arrays.parallelSetAll.

3

bạn có thể sử dụng IntStream.range để tạo chỉ mục và sau đó hoạt động trên đó.

C[] cs = (C[])IntStream.range(0, as.length) 
         .mapToObj(i -> op.apply(as[i], bs[i])) 
         .toArray(); 
Các vấn đề liên quan