2015-10-29 7 views
5

मैं जब एक समानांतर धारा का उपयोग करने की कोशिश कर रहा है और मैं एक समाधान पता कुछ अजीब परिणाम मिल रहे हैं, लेकिन यह नहीं लगता है आदर्शसमानांतर स्ट्रीम अशक्त आइटम देता है, जावा में कैसे करना है 8

// Create the set "selected" 
somethingDao.getSomethingList().parallelStream() 
       .filter(something -> !selected.contains(something.getSomethingId())) 
       .forEach(something -> 
           somethingSubGroupDTO.addFilterDTO(
             new FilterDTO(something.getSomethingName(), something.getSomethingDescription(), false)) 
       ); 
selected.clear(); 

somethingDao.getSomethingListList

selected है जो इस ऑपरेशन के दौरान संशोधित नहीं है।

somethingSubGroupDTO.addFilterDTO एक सहायक कार्य है जो एक असीमित सूची में जोड़ता है। यही समस्या है। एक असीमित सूची के रूप में मुझे उम्मीद से सूची में कम आइटम मिलते हैं और कुछ आइटम शून्य होते हैं। अगर मैं इसे सिंक्रनाइज़ सूची में बदल देता हूं तो यह काम करता है। स्पष्ट रूप से समानांतर धारा में लॉक विवाद जोड़ना आदर्श नहीं है।

उच्च स्तर पर मुझे पता है कि ऐसा करना संभव है कि प्रत्येक स्ट्रीम अपनी प्रसंस्करण करेगी और जब वे शामिल हों तो वे एकत्र होंगे। (कम से कम मैं लॉक विवाद के बिना ऐसी प्रक्रिया की कल्पना कर सकता हूं) हालांकि, जब से मैं जावा 8 स्ट्रीम प्रोसेसिंग में नया हूं, मुझे पता नहीं है कि कैसे। मैं एक ही बिंदु पर विवाद के बिना यह वही ऑपरेशन कैसे करूं?

उत्तर

8

forEach का उपयोग न करें और अपने स्ट्रीम इकट्ठा एक List बजाय में:

somethingDao.getSomethingList().parallelStream() 
       .filter(something -> !selected.contains(something.getSomethingId())) 
       .map(something -> new FilterDTO(something.getSomethingName(), something.getSomethingDescription(), false)) 
       .collect(toList()); 

उसके बाद, आप वापस आ सूची सीधे अपने somethingSubGroupDTO वस्तु में, बजाय एक समय में एक आइटम जोड़ने के सेट कर सकते हैं।

+0

और यह एक सूची देता है जिसे मैं अंत में एक समय के बजाय अंत में अपने संग्रह में जोड़ सकता हूं? –

+1

@CarlosBribiescas बिल्कुल – Tunaki

+0

धन्यवाद, जो मेरे प्रश्न का उत्तर देता है। फॉलो अप के रूप में, क्या यह निर्धारित करना संभव है कि उसे किस सूची में एकत्र करना चाहिए ताकि अंत में ऑटो स्वतः जुड़ जाए? जरूरी नहीं, सिर्फ उत्सुक है। –

संबंधित मुद्दे