Java8 उन अच्छा तरीकों getOrDefault()
और putIfAbsent()
शुरू की, की तरह कोड लिखने के लिए अनुमति:क्या मुझे getOrDefault() का उपयोग करने के बाद put() या putIfAbsent() का उपयोग करना चाहिए?
Map<Foo, List<Bar>> itemsByFoo = ...
List<Bar> bars = itemsByFoo.getOrDefault(key, new ArrayList<>());
bars.add(someNewBar);
अब मैं सोच रहा हूँ अगर वहाँ या तो के लिए अच्छा तथ्यात्मक कारण हैं कार्य करें:
itemsByFoo.put(key, bars);
या
itemsByFoo.putIfAbsent(key, bars);
दोनों काम करेगा:
- विकल्प 1 अनावश्यक का एक बहुत कुछ कर कॉल "डाल" जब सूचियों करने के लिए जोड़ने तत्वों अक्सर ऐसा होता है
- OPTION2 अनावश्यक "containsKey" का एक बहुत कुछ कर भी सकती है और कहता है जब नई चाबी के लिए नई प्रविष्टियां जोड़ने प्रमुख है
SO: विकल्प 1 या विकल्प 2 "हमेशा" के लिए जाने के अच्छे कारण हैं? आप नक्शे को संशोधित करने के बिना एक अनुपस्थित मूल्य के लिए एक स्टैंड में उपयोग करना चाहते हैं
अहम, * न *। 'आइटम्स ByFoo.computeIfAbsent (कुंजी, एक्स -> नया ऐरेलिस्ट <>()) .add (someNewBar) का उपयोग करें;' पूरे ऑपरेशन के लिए। – Holger
@ होल्गर हाँ :) उत्कृष्ट बिंदु। चूंकि 'putIfAbsent' एक' शून्य 'वापस कर सकता है क्योंकि यह * पिछले * मान देता है ... इसके अलावा' computeifAbsent' जावा -8 में मौजूद है, 7 नहीं। मुझे इससे पहले सामना करना पड़ा है ... – Eugene
@Eugene: 'putIfAbsent' को जावा 8 में' मानचित्र 'इंटरफ़ेस में जोड़ा गया था, क्योंकि अब यह' डिफ़ॉल्ट 'विधियों के साथ संभव था, लेकिन इसे' ConcurrentMap.putIfAbsent' का अनुबंध रखना था, जो जावा 5 के बाद से मौजूद है, इसलिए यह 'computeIfAbsent' के रूप में सुविधाजनक नहीं है ... – Holger