यहाँ Sotirios Delimanolis 'के उत्तर पर कुछ भिन्नताएँ हैं , जो कि (+1) के साथ शुरू करना बहुत अच्छा था। निम्नलिखित को धयान मे रखते हुए:
static <X, Y, Z> Map<X, Z> transform(Map<? extends X, ? extends Y> input,
Function<Y, Z> function) {
return input.keySet().stream()
.collect(Collectors.toMap(Function.identity(),
key -> function.apply(input.get(key))));
}
एक युगल यहाँ इंगित करता है। पहले जेनरिक में वाइल्डकार्ड का उपयोग होता है; यह फ़ंक्शन को कुछ अधिक लचीला बनाता है। एक वाइल्डकार्ड आवश्यक होगा यदि, उदाहरण के लिए, आप चाहते थे कि आउटपुट मैप में एक कुंजी हो जो इनपुट मैप की कुंजी का एक सुपरक्लास हो:
Map<String, String> input = new HashMap<String, String>();
input.put("string1", "42");
input.put("string2", "41");
Map<CharSequence, Integer> output = transform(input, Integer::parseInt);
(नक्शे के मूल्यों के लिए एक उदाहरण भी है, लेकिन यह वास्तव में वंचित है, और मैं मानता हूं कि वाई के लिए बाध्य वाइल्डकार्ड केवल किनारे के मामलों में मदद करता है।)
एक दूसरा बिंदु यह है कि इनपुट मानचित्र पर धारा को चलाने के बजाय entrySet
, मैंने इसे ऊपर चलाया keySet
। यह कोड को थोड़ा क्लीनर बनाता है, मुझे लगता है, नक्शे की प्रविष्टि के बजाय नक्शे से बाहर मूल्यों को लाने की कीमत पर। संयोग से, मैं शुरू key -> key
में पहले तर्क के रूप में था toMap()
और यह किसी कारण के लिए एक प्रकार की अनुमान त्रुटि के साथ विफल रहा। इसे बदलने के लिए (X key) -> key
काम किया, जैसा कि किया था Function.identity()
।
फिर भी एक और भिन्नता इस प्रकार है:
static <X, Y, Z> Map<X, Z> transform1(Map<? extends X, ? extends Y> input,
Function<Y, Z> function) {
Map<X, Z> result = new HashMap<>();
input.forEach((k, v) -> result.put(k, function.apply(v)));
return result;
}
यह Map.forEach()
धाराओं के बजाय उपयोग करता है। यह और भी सरल है, मुझे लगता है, क्योंकि यह कलेक्टरों के साथ फैलाव करता है, जो कि नक्शे के साथ उपयोग करने के लिए कुछ अनाड़ी हैं। कारण यह है कि Map.forEach()
कुंजी और मूल्य को अलग-अलग मापदंडों के रूप में दिया जाता है, जबकि स्ट्रीम का केवल एक मूल्य होता है - और आपको यह चुनना होगा कि कुंजी या मानचित्र प्रविष्टि को उस मान के रूप में उपयोग करना है या नहीं। माइनस साइड पर, यह अन्य दृष्टिकोणों की समृद्ध, सुव्यवस्थित अच्छाता का अभाव है। :-)
e -> e.getKey()
के साथMap.Entry::getKey
। लेकिन यह स्वाद / प्रोग्रामिंग शैली की बात है।