लॉन्गस्ट्रीम फ़िल्टरिंग [डुप्लिकेट]

Dec 01 2020

मेरे पास दो जावा लॉन्गस्ट्रीम हैं और मैं उन मूल्यों को हटाना चाहता हूं जो एक धारा में दूसरे से मौजूद हैं।

LongStream stream 1 = ...
LongStream stream 2 = ...

stream2  = stream2.filter(e-> stream1.contains(e));

लॉन्गस्ट्रीम में एक विधि नहीं होती है और मुझे नहीं पता कि इस मामले में किसी भी तरीके का उपयोग कैसे किया जाए क्योंकि चेक किया जाने वाला मान किसी अन्य स्ट्रीम से आ रहा है और एक चर या स्थिर में नहीं है।

जवाब

1 NikolasCharalambidis Dec 01 2020 at 13:59

खैर, आप स्ट्रीम में खोज नहीं कर सकते क्योंकि स्ट्रीम पाइपलाइनों का एक अधूरा सेट है, अर्थात ऑपरेशन। इस तरह की स्ट्रीम से इसकी तुलना करने का कोई मतलब नहीं है।

अगली बात जो मुझे अजीब लगती है वह शायद एक टाइपो है। मुझे लगता है कि आप stream1इसके बजाय खोजना चाहते हैं stream2, इसलिए:

stream2 = stream2.filter(e -> stream1.contains(e));

एकमात्र तरीका LongStreamएक संग्रह की तुलना करना है जो इस तरह की खोज के लिए अनुकूलित है। मुझे लगता है कि stream1आप खोज जारी रखने के बाद जारी रखना चाहते हैं, इसलिए इन चरणों का पालन करें:

  1. stream1इसे एक में परिवर्तित करना बंद करें List<Long> list1
  2. से stream2का उपयोग करके खोज करें ।list1stream1
  3. stream1आगे की प्रक्रिया के लिए फिर से खोलें ।
LongStream stream1 = ...
LongStream stream2 = ...

List<Long> list1 = stream1.boxed()                       // list1 from stream1 ..
                          .collect(Collectors.toList()); // .. which also closes stream1

stream2  = stream2.filter(list1::contains);              // perform search

stream1 = list1.stream().mapToLong(l -> l);              // open stream1 as LongStream

संपादित करें: उपयोग Setके रूप में @ बेहतर प्रदर्शन के लिए एफपीएस अपने में पता चलता है जवाब ।

3 fps Dec 01 2020 at 13:48

आप एक Setका उपयोग करने के लिए इकट्ठा कर सकते हैं contains:

LongStream stream1 = ...
LongStream stream2 = ...

Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());

stream2 = stream2.filter(set1::contains);
1 UsagiMiyamoto Dec 01 2020 at 14:17

धाराओं का उपयोग क्यों करें?

संग्रह में वह retainAll(Collection)विधि है, जो आपको चाहिए, यदि मैं गलत नहीं हूं ...
(या removeAll(Collection)बस थोड़ा सा ऊपर ...)