2017-12-22 118 views
5

में दो सरणी जोड़ी को गठबंधन करने का सुरुचिपूर्ण तरीका BiFunction द्वारा दो जेनेरिक सरणी जोड़ों को जोड़ना पसंद है। शायद Java 8 Stream साथ -जावा 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(); 
    } 
} 

मुझे आश्चर्य है कि वहाँ यह करने के लिए एक और अधिक सुरुचिपूर्ण तरीका एक के लिए लूप के बिना है यदि: यहां आप अनुभवहीन कार्यान्वयन देखते हैं। मैं आपके सुझावों के बारे में खुश रहूंगा।

+3

जबकि एओमिने ने आपके लूप के स्ट्रीम आधारित संस्करण प्रदान किए, मुझे नहीं लगता कि यह अधिक सुरुचिपूर्ण है। लेकिन यदि आप '.ेंज (..) 'के बाद' .parallel() 'जोड़ते हैं तो समानांतर प्रसंस्करण की संभावना खुलती है, इसलिए उस दृष्टिकोण का उपयोग मल्टीप्रोसेसर पर्यावरण में बेहतर हो सकता है। – Pshemo

+2

आप गुवा के ['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

आपको उस चेतावनी को दबाने नहीं देना चाहिए, बीटीडब्ल्यू। यह जल्दी या बाद में आपके चेहरे में उड़ना बाध्य है। – shmosel

उत्तर

3

आप सूचकांक उत्पन्न करने के लिए IntStream.range का उपयोग कर सकते हैं और फिर उस पर काम कर सकते हैं। ,

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

या अगर op गणना करने के लिए बहुत महंगा है, तो आप भी Arrays.parallelSetAll उपयोग कर सकते हैं:

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