आप Eclipse Collections से MutableMapIterable.updateValueWith(K key, Function0<? extends V> factory, Function2<? super V,? super P,? extends V> function, P parameter)
का उपयोग कर सकते हैं।
factory
तर्क किसी प्रारंभिक मान को बनाता है यदि कोई भी मानचित्र में नहीं है। function
तर्क को नए मान मूल्य के साथ आने के लिए अतिरिक्त पैरामीटर के साथ मानचित्र मूल्य पर लागू किया गया है। parameter
को updateValueWith()
पर अंतिम तर्क के रूप में पारित किया गया है। फ़ंक्शन को उस मामले में भी बुलाया जाता है जहां कुंजी मानचित्र में नहीं थी। तो प्रारंभिक मान वास्तव में function
factory
और parameter
के आउटपुट पर लागू होता है। function
को मान को म्यूटेट नहीं करना चाहिए; इसे एक नया मूल्य वापस करना चाहिए। आपके उदाहरण में, नक्शा मान स्ट्रिंग्स हैं जो अपरिवर्तनीय हैं इसलिए हम ठीक हैं।
org.eclipse.collections.impl.map.mutable.ConcurrentHashMap
जैसे समवर्ती मैप्स में updateValueWith()
का कार्यान्वयन थ्रेड-सुरक्षित और परमाणु भी है। यह महत्वपूर्ण है कि function
मानचित्र मानों को म्यूटेट नहीं करता है या यह थ्रेड-सुरक्षित नहीं होगा। इसे इसके बजाय नए मान वापस करना चाहिए। आपके उदाहरण में, नक्शा मान स्ट्रिंग्स हैं जो अपरिवर्तनीय हैं इसलिए हम ठीक हैं।
यदि आपकी विधि recalculateNewValue()
केवल स्ट्रिंग concatenation करता है, तो आप updateValueWith()
का उपयोग कैसे कर सकते हैं।
Function0<String> factory =() -> "initial ";
Function2<String, String, String> recalculateNewValue = String::concat;
MutableMap<String, String> map = new ConcurrentHashMap<>();
map.updateValueWith("test", factory, recalculateNewValue, "append1 ");
Assert.assertEquals("initial append1 ", map.get("test"));
map.updateValueWith("test", factory, recalculateNewValue, "append2");
Assert.assertEquals("initial append1 append2", map.get("test"));
आप एक ही बात को पूरा करने के जावा 8 के ConcurrentMap.compute(K key, BiFunction remappingFunction) उपयोग कर सकते हैं, लेकिन यह कुछ नुकसान है।
ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
map.compute("test", (key, oldValue) -> oldValue == null ? "initial append1 " : oldValue + "append1 ");
Assert.assertEquals("initial append1 ", map.get("test"));
map.compute("test", (key, oldValue) -> oldValue == null ? "initial append1 " : oldValue + "append2");
Assert.assertEquals("initial append1 append2", map.get("test"));
- अलग से कोई कारखाना इतना लैम्ब्डा के शरीर मूल्यों और प्रारंभिक मान से निपटने के लिए है अनुपस्थित कुंजी के मामले को संभालने के लिए नहीं है।
- एपीआई लैम्ब्स का पुन: उपयोग करने के लिए उपयुक्त नहीं है।
updateValueWith()
पर प्रत्येक कॉल एक ही लैम्ब्डा साझा करता है, लेकिन compute()
पर प्रत्येक कॉल ढेर पर नया कचरा बनाता है।
नोट: मैं, ग्रहण संग्रह
मैं देखता हूं, धन्यवाद। यह थोड़ा और कॉम्पैक्ट है। – Holger
'स्ट्रिंग' को छोड़ने और सब कुछ सीधे 'if' में डालने के बारे में क्या? – elect
यदि कोई अन्य थ्रेड PutIfAbsent के बीच मान बदलता है और आपको एक असंगत मान के साथ समाप्त करता है। – Uberto