ज्यादातर मामलों में, जब आप स्ट्रीम पर forEach
का उपयोग करके स्वयं को पाते हैं, तो आपको पुनर्विचार करना चाहिए कि क्या आप अपने काम के लिए सही टूल का उपयोग कर रहे हैं या आप इसे सही तरीके से उपयोग कर रहे हैं या नहीं।
आम तौर पर, आपको एक उपयुक्त टर्मिनल ऑपरेशन की तलाश करनी चाहिए जो आप प्राप्त करना चाहते हैं या उपयुक्त कलेक्टर के लिए। अब, Map
एस और List
एस के उत्पादन के लिए संग्राहक हैं, लेकिन एक अनुमान के आधार पर दो अलग-अलग संग्राहकों के संयोजन के लिए बॉक्स ऑफ कलेक्टर से बाहर नहीं है।
अब, this answer में दो संग्राहक संयोजन के लिए एक संग्राहक शामिल है। इस कलेक्टर का उपयोग करना, आप के रूप में
Pair<Map<KeyType, Animal>, List<KeyType>> pair = animalMap.entrySet().stream()
.collect(conditional(entry -> entry.getValue() != null,
Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue),
Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
Map<KeyType,Animal> myMap = pair.a;
List<KeyType> myList = pair.b;
कार्य प्राप्त कर सकते हैं लेकिन शायद, आप एक सरल तरीके से इस विशेष कार्य हल कर सकते हैं। आप में से एक परिणाम इनपुट प्रकार से मेल खाता है; यह वही नक्शा है जो प्रविष्टियों को तोड़ देता है जो null
पर नक्शा लगाते हैं।यदि आपका मूल नक्शा परिवर्तनशील है और आप इसे बाद में की जरूरत नहीं है, तो आप सिर्फ सूची को इकट्ठा करने और के रूप में वे परस्पर अनन्य हैं मूल नक्शे से इन कुंजियों को दूर कर सकते हैं:
List<KeyType> myList=animalMap.entrySet().stream()
.filter(pair -> pair.getValue() == null)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
animalMap.keySet().removeAll(myList);
ध्यान दें कि आप null
लिए मैपिंग को हटा सकते हैं
animalMap.values().removeIf(Objects::isNull);
या
animalMap.values().removeAll(Collections.singleton(null));
: यहां तक कि अन्य कुंजियों की सूची बिना
यदि आप मूल मानचित्र को संशोधित नहीं कर सकते (या नहीं चाहते हैं), कस्टम कलेक्टर के बिना अभी भी एक समाधान है। के रूप में Alexis C.’s answer में संकेत दिया, partitioningBy
सही दिशा में जा रहा है, लेकिन आप इसे आसान बनाने में कर सकते हैं:
Map<Boolean,Map<KeyType,Animal>> tmp = animalMap.entrySet().stream()
.collect(Collectors.partitioningBy(pair -> pair.getValue() != null,
Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));
Map<KeyType,Animal> myMap = tmp.get(true);
List<KeyType> myList = new ArrayList<>(tmp.get(false).keySet());
लब्बोलुआब यह है, साधारण संग्रह संचालन के बारे में भूल नहीं है, आप के साथ सब कुछ करने की जरूरत नहीं है नया स्ट्रीम एपीआई।
ऐसी स्थिति की तरह लगता है जहां धाराएं वास्तव में आपको कोई पक्ष नहीं दे रही हैं। यह सिर्फ एपीआई के साथ कंट्रोल फ्लो सिंटैक्स को छुपा रहा है जो अजीब हो जाता है और आपका 'फॉरएच' लैम्बडा स्टेटफुल है। – Radiodef