बूलियन का उपयोग? अगर अभिव्यक्ति में


130

यदि मेरे पास एक अशक्त है Boolean b, तो मैं जावा में निम्नलिखित तुलना कर सकता हूं:

Boolean b = ...;
if (b != null && b) {
   /* Do something */
} else {
   /* Do something else */
}

कोटलिन में, मैं !!ऑपरेटर का उपयोग करके उसी को प्राप्त कर सकता हूं :

val b: Boolean? = ...
if (b != null && b!!) {
   /* Do something */
} else {
   /* Do something else */
}

हालांकि, !!अशक्त सुरक्षा प्रणाली को दरकिनार करते हुए, मेरे लिए थोड़ा सा स्केच का उपयोग महसूस होता है।

क्या इसके लिए अधिक सुरुचिपूर्ण दृष्टिकोण है?


संपादित करें ऐसा लगता है कि मैंने थोड़ा ओवरसाइम्पल किया है। स्थानीय चर के लिए, जैसा कि बंथर दिखाता है, यह काम करता है। हालांकि, मेरा बूलियन bवास्तव में एक "बैकिंग क्षेत्र के साथ संपत्ति" है (मैं वास्तव में अभी तक गति करने के लिए नहीं हूं कि यह क्या लगाता है)। यह परिणाम है:

यहाँ छवि विवरण दर्ज करें


आपको आवश्यकता क्यों है !!bऔर बस नहीं b? (मैं कोटलिन, बस क्यूरियोस से परिचित नहीं हूं)
मैरॉन

1
@MarounMaroun चूंकि कोटलिन की एक विशेषता bहो सकती है nullऔर अशक्त सुरक्षा है , जो अशक्त संदर्भों का मूल्यांकन करने की कोशिश करते समय संकलन त्रुटियों को देता है। इस प्रकार, सादे का उपयोग bसंकलन त्रुटि देता है :)
nhaarman

लेकिन b != nilसही पक्ष की जाँच करने से पहले उसे नहीं पकड़ेंगे?
मैराथन

आप वास्तव में कहेंगे, लेकिन मेरी आईडीई अन्यथा कहती है। मुझे याद है कि ऐसा कुछ काम करना चाहिए, मैं देखूंगा कि क्या मुझे कुछ मिल सकता है।
नहरमन

मुझे लगता है कि val r = b?doSomething() ?: doSomethingElse()काम करना चाहिए।
मैराथन

जवाबों:


183

आप के साथ नल बूलियन तुलना कर सकते हैं true, falseया nullसमानता ऑपरेटर का उपयोग:

var b: Boolean? = null
if (b == true) {
    // b was not null and equal true
} 
if (b == false) {
   // b is false 
}
if (b != true) { 
   // b is null or false 
}

4
नोट: उलटा ऑपरेटर के साथ काम करने के लिए प्रतीत नहीं होता है!
रिचर्ड

7
@Richard यह एक होने 3 संभावित मान के रूप में ख में सोचने के लिए मदद करता है: true, falseया null। फिर जब कर if (b != true)आप केवल पता है कि ख सच नहीं है, लेकिन आप के बारे में कुछ भी नहीं पता falseयाnull
jivimberg

7
eg2। if (b != true) // b is null or falseeg3। if (b == false) // b is false
hmac

यह सही उत्तर है और कोटलिन में समझ में आता है, लेकिन जावा पृष्ठभूमि से आने पर यह एक if-statement के भीतर स्पष्ट रूप से सही या गलत या अशक्त की तुलना करने में अजीब लग सकता है, जो यह बता सकता है कि यह इतना लोकप्रिय प्रश्न और उत्तर क्यों है।
माइकल पीटरसन

31

आप सफाई से जांच चाहते हैं एक है कि क्या Boolean?है trueया falseआप कर सकते हैं:

when(b) {
    true -> {}
    false -> {}
}

यदि आप जांचना चाहते हैं कि क्या आप इसमें मूल्य के रूप में इसे null(या else) जोड़ सकते हैं when:

when(b) {
    true -> {}
    false -> {}
    null -> {}
}

when(b) {
    true -> {}
    false -> {}
    else-> {}
}

22

कोटलिन सांख्यिकीय रूप से आपके अशक्त जांच का विश्लेषण करेगा। यह ठीक है:

val b: Boolean? = null
if (b != null && b) {
    println(b)
}

भले ही यह टाइप त्रुटि के साथ विफल हो:

val b: Boolean? = null
if (b == null && b) {
    println(b)
}

अधिक देखने के लिए: http://kotlinlang.org/docs/reference/null-safety.html

आप "नीस कोलेसिंग ऑपरेटर" का भी उपयोग कर सकते हैं (जो कि परिवर्तनशील चर के लिए काम करेगा):

val b: Boolean? = null
if (b ?: false) {
    println(b)
}

विश्लेषण केवल अपरिवर्तनीय मूल्यों के लिए काम करता है। यदि आपको यह करने योग्य फ़ील्ड में करने की आवश्यकता है, तो इसे अस्थायी स्थानीय चर में संग्रहीत करें।
पियोट्र्स प्रज्मो

1
यह वास्तव में समझ में आता है। अशक्त सहवर्ती ऑपरेटर शायद वही है जिसकी मुझे तलाश थी। धन्यवाद!
नहरमन

@ बंथर जो पूरी तरह से सही नहीं है (आपका दूसरा उदाहरण होगा var?) ... यदि यह एक स्थानीय है varतो संकलक अभी भी सुरक्षित कलाकारों को अनुमति दे सकता है। अधिक विशेष मामलों के लिए, stackoverflow.com/questions/34498562/…
जैसन मिनार्ड

null coalescing elvis को असाइनमेंट में स्थानांतरित किया जा सकता हैval booleanVal = nullableProducer?.produceVal() ?: false; if (booleanVal) {}
सर्ज

6

मैंने बूलियन को क्या देखा है? एक विधि का एक परिणाम है जो बूलियन को एक ऐसी वस्तु पर लौटाता है जो अशक्त है

val person: Person? = null
....
if(person?.isHome()) { //This won't compile because the result is Boolean?
  //Do something
}

मैं जिस समाधान का उपयोग कर रहा हूं, वह letइस तरह से संभव रिटर्न वाले शून्य मान को निकालने के लिए फ़ंक्शन का उपयोग करना है

person?.let {
  if(it.isHome()) {
    //Do something
  }
}

5
यदि आप ifब्लॉक द्वारा प्रतिस्थापित करते हैं, तो पहले एक संकलन करता है person?.isHome() == true
Hesam

2

कोटलिन में, आप इस तरह कर सकते हैं:

val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
    /* Do something */
} else {
    /* Do something else */
}

3
b != null && b == trueके रूप में ही है b == true
नहरमन

1

सबसे पहले, नीचे दिए गए कस्टम इनलाइन फ़ंक्शन को जोड़ें:

inline fun Boolean?.ifTrue(block: Boolean.() -> Unit): Boolean? {
    if (this == true) {
        block()
    }
    return this
}

inline fun Boolean?.ifFalse(block: Boolean?.() -> Unit): Boolean? {
    if (null == this || !this) {
        block()
    }

    return this
}

तो आप इस तरह कोड लिख सकते हैं:

val b: Boolean? = ...
b.ifTrue {
   /* Do something in true case */
}

//or

b.ifFalse {
   /* Do something else in false case */
}

हां, इस मामले में: b.ifTrue {...} या b.ifFalse {...} यह उपयोगी हो सकता है
zyc zyc

1

कोटलिन के लिए जो मैं सामान्य रूप से उपयोग करता हूं

if (object?.booleanProperty ==true)
   { 
     //do stuff 
   }

यह केवल तभी काम करेगा जब संपत्ति सत्य है और ऑब्जेक्ट शून्य नहीं है। रिवर्स के लिए:

if (!object?booleanProperty !=true)
   { 
     //do Stuff
   }

0

चलो एक के if-elseसाथ एक बयान का उपयोग करें Elvis Operator:

val a: Boolean?
val b: Boolean?

a = true
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}

// परिणाम: "उनमें से एक अशक्त नहीं है ..."

a = null
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}

// परिणाम: "दोनों अशक्त हैं!"


0

यदि आप मदद करते हैं, तो एक्सटेंशन फ़ंक्शन जोड़ना बहुत आसान है।

fun Boolean?.orDefault(default: Boolean = false): Boolean {
    if (this == null)
        return default
    return this
}

var x: Boolean? = null

if(x.orDefault()) {
..
}

0

यदि आप containएक जैसे ऑपरेशन करना चाहते हैं तो आप Stringनीचे की तरह समानता की जांच कर सकते हैं -

if (url?.contains("xxx") == true){
  return false;
}

-1

आप सुरक्षित ऑपरेटर "लेट" के साथ कर सकते हैं

val b: Boolean? = null
b?.let { flag ->
    if(flag){
        // true Block
    } else {
        // false Block
    }
}

यह बस सच नहीं है, और एक अपवाद में फेंक दिया जाएगा।
नहरमन

मेरा उत्तर संपादित पिछली टिप्पणी के आधार पर
finalpets
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.