2015-09-28 9 views
46

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

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

हालांकि:

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

Kotlin में, मैं एक ही !! ऑपरेटर का उपयोग करके प्राप्त कर सकते हैं , !! का उपयोग मुझे थोड़ा सा स्केची महसूस करता है, जो शून्य सुरक्षा प्रणाली को बाधित करता है।

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


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

enter image description here

+0

आपको क्यों चाहिए !!बी 'और बस' बी' नहीं? (मैं कोटलिन से परिचित नहीं हूं, सिर्फ curios) – Maroun

+0

@MarounMaroun चूंकि 'बी'' शून्य 'हो सकता है और कोटलिन की विशेषताओं में से एक [शून्य सुरक्षा] है (http://kotlinlang.org/docs/reference/null- security.html # the - ऑपरेटर), जो निरर्थक संदर्भों का मूल्यांकन करने का प्रयास करते समय संकलन त्रुटियों को देता है। इस प्रकार, सादा 'बी' का उपयोग संकलन त्रुटि देता है :) – nhaarman

+0

लेकिन सही पक्ष की जांच करने से पहले' b! = Nil' पकड़ नहीं होगा? – Maroun

उत्तर

61

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

var b: Boolean? = null 
if (b == true) { 
    // b was not null and equal true 
} 
+1

पढ़ें नोट: उलटा ऑपरेटर के साथ काम नहीं कर रहा है! ' – Richard

15

Kotlin स्थिर अपने अशक्त चेकों का विश्लेषण करेगा: यह परिणाम है। यह ठीक है:

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) 
} 
+0

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

+1

यह वास्तव में समझ में आता है। नल कोलेसिंग ऑपरेटर शायद वह है जो मैं ढूंढ रहा था। धन्यवाद! – nhaarman

+0

@ बंथर जो पूरी तरह से सही नहीं है (आपका दूसरा उदाहरण 'var' होगा?) ... यदि यह एक स्थानीय' var' है तो संकलक अभी भी सुरक्षित कास्ट की अनुमति दे सकता है। अधिक विशेष मामलों के लिए, http://stackoverflow.com/questions/34498562/in-kotlin-what-is-the-idiomatic-way-to-deal-with-nullable-values-referencing-o/34498563#34498563 –

7

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

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

आप जाँच करना चाहते हैं अगर यह null आप कर सकते हैं है when:

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

when(b) { 
    true -> {} 
    false -> {} 
    else-> {} 
} 
में एक मान के रूप में जोड़ें (या else)
1

मैंने जो बूलियन देखा है उससे? एक विधि है कि एक वस्तु पर बूलियन देता है कि व्यर्थ है

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

समाधान मैं उपयोग कर रहे हैं तो

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

यदि आप 'if' ब्लॉक को' व्यक्ति 'से बदलते हैं तो पहला संकलित करता है .isHome() == true'। – Hesam

1
तरह संभव लौटे शून्य मान को दूर करने के let समारोह का उपयोग करने के लिए है का परिणाम है

कोटलिन के लिए जो मैं सामान्य रूप से उपयोग करता हूं वह if (object?.booleanProperty ==true) { //do stuff } यह केवल तभी काम करेगा जब संपत्ति सत्य है और ऑब्जेक्ट शून्य नहीं है। रिवर्स के लिए: if (!object?booleanProperty !=true) { //do Stuff}

संबंधित मुद्दे