सबसे पहले दोनों तरीकों की घोषणा की जांच करें।
1) आदेश: तर्क को निष्पादित करें और परिणाम को तर्क के रूप में पास करें।
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet: यदि वैकल्पिक के अंदर मान शून्य है तो तर्क को निष्पादित करें
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
उपरोक्त घोषणा पर कुछ स्पष्टीकरण:
"Optional.orElse" का तर्क हमेशा वैकल्पिक (शून्य, रिक्त या मूल्य के साथ) में वस्तु के मूल्य के बावजूद निष्पादित होता है। हमेशा "Optional.orElse" का उपयोग करते समय उपर्युक्त बिंदु को ध्यान में रखें, अन्यथा निम्नलिखित स्थिति में "Optional.orElse" का उपयोग बहुत जोखिम भरा हो सकता है।
रिस्क -1) लॉगिंग इश्यू: अगर ऑर्ल के अंदर की सामग्री में कोई लॉग स्टेटमेंट है: तो इस स्थिति में, आप हर बार लॉगिंग को समाप्त कर देंगे।
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
जोखिम -2) प्रदर्शन का मुद्दा: अगर orlse के अंदर की सामग्री समय-गहन है: समय गहन सामग्री किसी भी i / o संचालन DB कॉल, एपीआई कॉल, फ़ाइल रीडिंग हो सकती है। यदि हम ऐसी सामग्री को orElse () में डालते हैं, तो सिस्टम बिना किसी उपयोग के कोड निष्पादित करेगा।
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
जोखिम -3) अवैध राज्य या बग का मुद्दा: यदि वस्तु के अंदर की सामग्री किसी वस्तु को बदल रही है: हम दूसरी जगह पर उसी वस्तु का उपयोग कर रहे होंगे जो Optional.map फ़ंक्शन के अंदर कहती है और यह हमें एक महत्वपूर्ण बग में डाल सकती है।
List<Model> list = new ArrayList<>();
Optional.of(getModel())
.map(x -> {
})
.orElse(get(list));
get(List < String > list) {
log.error("No Data found, Returning default");
list.add(defaultValue);
return defaultValue;
}
तब, हम orElse () के साथ कब जा सकते हैं?
जब डिफ़ॉल्ट मान कुछ स्थिर ऑब्जेक्ट है, तो enum का उपयोग करना पसंद करें। उपरोक्त सभी मामलों में हम Optional.orElse () के बजाय Optional.orElseGet () के साथ जा सकते हैं (जो केवल तब निष्पादित होता है जब Optional में गैर रिक्त मान होता है)। क्यों?? OrElse में, हम डिफॉल्ट परिणाम मान पास करते हैं, लेकिन orElseGet में हम आपूर्तिकर्ता को पास करते हैं और आपूर्तिकर्ता की विधि केवल तभी निष्पादित होती है यदि वैकल्पिक में मान शून्य है।
इस से मुख्य takeaways:
- यदि इसमें कोई लॉग स्टेटमेंट है तो “Optional.orElse” का उपयोग न करें।
- यदि यह समय-गहन तर्क सम्मिलित करता है, तो "Optional.orElse" का उपयोग न करें।
- यदि यह किसी वस्तु की स्थिति को बदल रहा है, तो "Optional.orElse" का उपयोग न करें।
- अगर हमें एक निरंतर, एनम को वापस करना है तो "Optional.orElse" का उपयोग करें।
- 1,2 और 3 अंक में वर्णित स्थितियों में "Optional.orElseGet" को प्राथमिकता दें।
मैंने इसे बिंदु -2 ( "Optional.map/Optional.orElse"! = "If / else" ) में अपने माध्यम ब्लॉग में समझाया है । एक प्रोग्रामर के रूप में Java8 का उपयोग कोडर के रूप में नहीं
orElseGet
करते हैं तो आपूर्तिकर्ता को केवल तभी कॉल किया जाता है जब मूल्य अनुपस्थित हो।