मैं यह पता नहीं लगा सकता कि ?:इस मामले में उदाहरण के लिए क्या करता है
val list = mutableList ?: mutableListOf()
और इसे क्यों संशोधित किया जा सकता है
val list = if (mutableList != null) mutableList else mutableListOf()
मैं यह पता नहीं लगा सकता कि ?:इस मामले में उदाहरण के लिए क्या करता है
val list = mutableList ?: mutableListOf()
और इसे क्यों संशोधित किया जा सकता है
val list = if (mutableList != null) mutableList else mutableListOf()
जवाबों:
TL; DR: यदि परिणामी वस्तु संदर्भ [पहला ऑपरेंड] नहीं है null, तो इसे लौटा दिया जाता है। अन्यथा दूसरे ऑपरेंड (जो हो सकता है null) का मान लौटाया जाता है
एल्विस ऑपरेटर कई प्रोग्रामिंग भाषाओं, जैसे Kotlin लेकिन यह भी ग्रूवी या सी # का हिस्सा है। मुझे विकिपीडिया की परिभाषा बहुत सटीक लगती है:
कुछ कंप्यूटर प्रोग्रामिंग भाषाओं में, एल्विस ऑपरेटर
?:एक द्विआधारी ऑपरेटर है जो अपना पहला ऑपरेंड लौटाता है यदि वह ऑपरेंड हैtrue, और अन्यथा उसका दूसरा ऑपरेंड का मूल्यांकन और रिटर्न करता है। यह एक है त्रिगुट सशर्त ऑपरेटर के संस्करण ,? :, उन भाषाओं (और कई अन्य) में पाया: एल्विस ऑपरेटर है अपनी दूसरी छोड़े गए संकार्य के साथ त्रिगुट ऑपरेटर ।
कोटलिन के लिए निम्नलिखित विशेष रूप से सच है:
कुछ कंप्यूटर प्रोग्रामिंग भाषाओं में इस ऑपरेटर के लिए अलग शब्दार्थ हैं। बूलियन में परिणाम होने वाले पहले ऑपरेंड के बजाय, इसका परिणाम ऑब्जेक्ट संदर्भ में होना चाहिए । यदि परिणामी वस्तु संदर्भ नहीं है
null, तो इसे लौटा दिया जाता है। अन्यथा दूसरे ऑपरेंड (जो हो सकता हैnull) का मान लौटाया जाता है।
एक उदाहरण:
x ?: y // yields `x` if `x` is not null, `y` otherwise.
elvis operatorइसे कुछ और घटाया जा सकता है। अच्छा! और अच्छी व्याख्या, धन्यवाद!
एल्विस ऑपरेटर उसके बाद एक कॉलन एक प्रश्न चिह्न का प्रतिनिधित्व करती है: ?:और यह इस वाक्य रचना के साथ प्रयोग किया जा सकता है:
first operand ?: second operand
यह आपको एक कॉन्सस कोड लिखने में सक्षम बनाता है, और इस तरह काम करता है:
यदि first operand अशक्त नहीं है , तो उसे वापस कर दिया जाएगा। यदि यह अशक्त है , तो second operandवसीयत वापस कर दी जाएगी। इसका उपयोग यह गारंटी देने के लिए किया जा सकता है कि कोई अभिव्यक्ति शून्य मान नहीं लौटाएगी, क्योंकि यदि आप प्रदान किया गया मान अशक्त है तो आप एक अशक्त मान प्रदान करेंगे।
उदाहरण के लिए (कोटलिन में):
fun retrieveString(): String { //Notice that this type isn't nullable
val nullableVariable: String? = getPotentialNull() //This variable may be null
return nullableVariable ?: "Secondary Not-Null String"
}
इस मामले में, यदि गणना की गई मान getPotentialNullशून्य नहीं है, तो इसे वापस कर दिया जाएगा retrieveString; यदि यह अशक्त है, तो "Secondary Not-Null String"इसके बजाय दूसरी अभिव्यक्ति लौटा दी जाएगी।
यह भी ध्यान दें कि दाएं हाथ की अभिव्यक्ति का मूल्यांकन केवल तभी किया जाता है जब बाएं हाथ की ओर अशक्त हो ।
कोटलिन में, आप किसी भी अभिव्यक्ति का उपयोग कर सकते हैं second operand, जैसे कि एक throw Exceptionअभिव्यक्ति
return nullVariable ?: throw IllegalResponseException("My inner function returned null! Oh no!")
एल्विस ऑपरेटर का नाम प्रसिद्ध अमेरिकी गायक एल्विस प्रेस्ले से आता है । उनका हेयर स्टाइल एक प्रश्न चिह्न जैसा दिखता है
स्रोत: वोज्डा, आई। मोस्कला, एम। एंड्रॉइड डेवलपमेंट विद कोटलिन। 2017. पैकट प्रकाशन
इसे एल्विस ऑपरेटर कहा जाता है और यह करता है ... वास्तव में आपने अपने प्रश्न में क्या वर्णित किया है। यदि इसका बायाँ हाथ पक्ष एक nullमान है, तो यह एक खामी के रूप में, इसके बजाय दाईं ओर रिटर्न देता है। अन्यथा यह केवल बाएं हाथ की तरफ मूल्य लौटाता है।
a ?: bके लिए बस आशुलिपि है if (a != null) a else b।
प्रकारों के साथ कुछ और उदाहरण:
val x: String? = "foo"
val y: String = x ?: "bar" // "foo", because x was non-null
val a: String? = null
val b: String = a ?: "bar" // "bar", because a was null
a != null ? a : b
चलो रक्षा पर एक नज़र डालते हैं :
जब हमारे पास एक अशक्त संदर्भ आर होता है, तो हम कह सकते हैं "यदि r शून्य नहीं है, तो इसका उपयोग करें, अन्यथा कुछ गैर-शून्य मान x का उपयोग करें":
?:(एल्विस) ऑपरेटर शब्दाडंबर से बचा जाता है और वास्तव में संक्षिप्त अपने कोड बनाता है।
उदाहरण के लिए, बहुत सारे संग्रह विस्तार फ़ंक्शन nullफ़ॉलबैक के रूप में लौटते हैं ।
listOf(1, 2, 3).firstOrNull { it == 4 } ?: throw IllegalStateException("Ups")
?:यदि आप फॉलबैक की कई परतें हैं, तो भी आपको फॉलबैक मामले को संभालने का एक तरीका प्रदान करता है। यदि ऐसा है, तो आप बस एल्विस ऑपरेटरों की श्रृंखला को यहाँ की तरह बढ़ा सकते हैं:
val l = listOf(1, 2, 3)
val x = l.firstOrNull { it == 4 } ?: l.firstOrNull { it == 5 } ?: throw IllegalStateException("Ups")
यदि आप उसी के साथ व्यक्त करते हैं, तो यह एक बहुत अधिक कोड होगा जो पढ़ना मुश्किल है।
बस हम कह सकते हैं कि, आपके दो हाथ हैं। आप जानना चाहते हैं, क्या अभी आपका बायां हाथ काम कर रहा है? अगर बायां हाथ काम नहीं कर रहा है, return emptyतोbusy
जावा के लिए उदाहरण:
private int a;
if(a != null){
println("a is not null, Value is: "+a)
}
else{
println("a is null")
}
कोटलिन के लिए उदाहरण:
val a : Int = 5
val l : Int = if (a != null) a.length else "a is null"
कोटलिन में एल्विस ऑपरेटर का उपयोग शून्य सुरक्षा के लिए किया जाता है।
x = a ?: b
उपरोक्त कोड में, यदि नहीं है और यदि है x, का मान असाइन किया जाएगा ।anullbanull
एल्विस ऑपरेटर का उपयोग किए बिना समकक्ष कोटलिन कोड नीचे है:
x = if(a == null) b else a