Boole kullanımı? if ifadesinde


130

Null değerim varsa Boolean b, Java'da aşağıdaki karşılaştırmayı yapabilirim:

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

Kotlin'de !!operatörü kullanarak aynısını başarabilirim :

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

Bununla birlikte, !!boş güvenlik sistemini atlatarak, kullanımı bana biraz kabataslak geliyor.

Bunun için daha zarif bir yaklaşım var mı?


Düzenle Görünüşe göre biraz fazla basitleştirdim. Banthar'ın gösterdiği gibi yerel değişkenler için işe yarıyor. Bununla birlikte, benim Boole'm baslında bir "destek alanı olan bir özelliktir" (bunun ne anlama geldiğini henüz tam olarak bilmiyorum). Sonuç şu:

görüntü açıklamasını buraya girin


Neden !!bbasitçe değil de ihtiyacınız var b? (Kotlin'e o kadar aşina değilim, sadece merak
ediyorum

1
@MarounMaroun Since bolabilir nullve Kotlin'in özelliklerinden biri, null atanabilir referansları değerlendirmeye çalışırken derleme hataları veren Null Safety'dir . Bu nedenle, düz kullanmak bbir derleme hatası verir :)
nhaarman

Ama b != nilsağ tarafı kontrol etmeden bunu anlayamayacak mısın?
Maroun

Gerçekten söylerdiniz, ancak IDE'm aksini söylüyor. Böyle bir şeyin işe yaraması gerektiğini hatırlıyorum, bir şey bulabilecek miyim bir bakacağım.
nhaarman

Bence val r = b?doSomething() ?: doSomethingElse()çalışmalı.
Maroun

Yanıtlar:


184

Sen null ile boole'sini karşılaştırabilirsiniz true, falseya nulleşitlik operatörü kullanılarak:

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
not: ters operatörle çalışmıyor gibi görünüyor!
Richard

7
@Richard bir sahip 3 olası değerler olarak b düşünmek yardımcı olur: true, falseveya null. Sonra yaparken if (b != true)sadece bu b bilmek doğru değildir, ancak hakkında hiçbir şey bilmeyen falseveyanull
jivimberg

7
eg2. if (b != true) // b is null or falseEG3. if (b == false) // b is false
hmac

Bu doğru cevaptır ve Kotlin'de mantıklıdır, ancak Java arka planından gelince, bir if-ifadesi içinde doğru veya yanlış veya boş ile açıkça karşılaştırmak garip gelebilir, bu da bunun neden bu kadar popüler bir soru ve cevap olduğunu açıklayabilir.
Michael Peterson

31

Eğer temiz bir şekilde kontrol etmek istiyorsanız ister Boolean?ise trueya falseYapabileceğiniz:

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

Kontrol etmek nullistiyorsanız, bunu (veya else) aşağıdakilere bir değer olarak ekleyebilirsiniz when:

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

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

22

Kotlin, boş çeklerinizi statik olarak analiz edecektir. Bu iyi:

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

Bu, tür hatasıyla başarısız olsa da:

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

Daha fazla bilgi için bkz: http://kotlinlang.org/docs/reference/null-safety.html

Ayrıca "boş birleştirme operatörü" de kullanabilirsiniz (değişebilir değişkenler için çalışacaktır):

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

Analiz yalnızca değişmez değerler için çalışır. Bunu değiştirilebilir bir alana yapmanız gerekiyorsa, geçici yerel değişkene depolayın.
Piotr Praszmo

1
Bu gerçekten mantıklı. Boş birleştirme operatörü muhtemelen aradığım şeydi. Teşekkürler!
nhaarman

@Banthar bu tamamen doğru değil (ikinci örneğiniz olur varmu?) ... eğer yerel varise derleyici yine de güvenli atama izin verebilir. Daha özel durumlar için stackoverflow.com/questions/34498562/… 'yi
Jayson Minard

null coalescing elvis göreve taşınabilirval booleanVal = nullableProducer?.produceVal() ?: false; if (booleanVal) {}
Serge

6

Boolean'ı gördüğümden mi? boş değer atanabilir bir nesnede Boolean döndüren bir yöntemin sonucudur

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

Kullanmakta olduğum çözüm, letişlevi döndürülen olası boş değeri kaldırmak için kullanmaktır.

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

5
Birincisi, ifbloğu ile değiştirirseniz derlenir person?.isHome() == true.
Hesam

2

Kotlin'de şunu yapabilirsiniz:

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 == trueile aynıdır b == true.
nhaarman

1

ilk olarak, özel satır içi işlevi aşağıya ekleyin:

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
}

o zaman şu şekilde kod yazabilirsiniz:

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

//or

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

Evet, şu durumda: b.ifTrue {...} veya b.ifFalse {...} yararlı olabilir
zyc zyc

1

Kotlin için normalde kullandığım şey

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

bu yalnızca özellik true olduğunda ve nesne boş olmadığında çalışır. Tersi için:

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

0

Bir if-elseifade kullanalım 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!")
}

// Sonuç: "Bir tanesi boş değer atanamaz ..."

a = null
b = null

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

// Sonuç: "Her ikisi de boş değerdir!"


0

Size yardımcı olacaksa, bir uzantı işlevi eklemek oldukça kolaydır.

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

var x: Boolean? = null

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

0

Bir containüzerinde benzer işlemler yapmak istiyorsanız, Stringaşağıdaki gibi eşitlik kontrolünü kullanabilirsiniz -

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

-1

Güvenli Operatör "izin ver" ile yapabilirsiniz

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

Bu kesinlikle doğru değildir ve fırlatılan bir istisna olarak geri dönecektir.
nhaarman

Cevabımı önceki yoruma göre düzenledim
finalpets
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.