2016-05-14 18 views
20

Czy powinienem używać podwójnie =, czy potrójnie =?najlepszy sposób na sprawdzenie wartości null w kotlinach?

if(a === null) { 
//do something 
} 

lub

if(a == null) { 
//do something 
} 

Podobnie w przypadku 'nie równa się':

if(a !== null) { 
//do something 
} 

lub

if(a != null) { 
//do something 
} 
+0

mają wyglądać na link: - https://kotlinlang.org /docs/reference/null-safety.html ..............To proste w Kotlin Docs – sushildlh

Odpowiedz

15

Oba podejścia generują ten sam kod bajtowy więc można wybrać co wolisz .

+0

Jeśli zrozumiałem to poprawnie, to on prosi o najlepszy sposób sprawdzenia wartości null w Kotlin, a nie które podejście generuje najlepszy kod bajtu. @ BenitoBertoli odpowiedź wygląda obiecująco, redukuje kod na płycie głównej – imGs

36

równość strukturalny a == b jest tłumaczony

a?.equals(b) ?: (b === null) 

Zatem przy porównywaniu z null, równość strukturalny a == null są przenoszone na referencyjnym równości a === null.

Według docs, nie ma sensu w optymalizacji kodu, dzięki czemu można używać a == null i a != null


Uwaga że jeśli zmienna jest właściwością zmienny, nie będzie w stanie się do inteligentnego odrzuć go do swojego typu nieululującego w instrukcji if (ponieważ wartość mogła zostać zmodyfikowana przez inny wątek), a zamiast tego musiałbyś użyć operatora bezpiecznego połączenia z numerem let.

Bezpieczne operator call?.

a?.let { 
    // not null do something 
    println(it) 
    println("not null") 
} 


Można go używać w połączeniu z operatorem Elvisa.

Elvis operator ?:(zgaduję, ponieważ znak przesłuchań wygląda włosów Elvisa)

a ?: println("null") 

A jeśli chcesz uruchomić blok kodu

a ?: run { 
    println("null") 
    println("The King has left the building") 
} 

Łączenie dwóch następujących

a?.let { 
    println("not null") 
    println("Wop-bop-a-loom-a-boom-bam-boom") 
} ?: run { 
    println("null") 
    println("When things go null, don't go with them") 
} 
+0

dlaczego nie używasz 'if' dla sprawdzeń zerowych? 'a? .let {}?: run {}' jest właściwe tylko w rzadkich przypadkach, w przeciwnym razie nie jest idiomatyczne. – voddan

+0

@voddan Nie sugerowałem, że nie używam, jeśli dla sprawdzenia "null", wymieniałem inne możliwe opcje. Chociaż nie jestem pewien, czy 'run' ma jakąś karę za wydajność. Zaktualizuję moją odpowiedź, aby była bardziej przejrzysta. –

1

Sprawdź użyteczne metody out, to może być przydatne:

/** 
* Performs [R] when [T] is not null. Block [R] will have context of [T] 
*/ 
inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? { 
    return input?.let(callback) 
} 

/** 
* Checking if [T] is not `null` and if its function completes or satisfies to some condition. 
*/ 
inline fun <T: Any> T?.isNotNullAndSatisfies(check: T.() -> Boolean?): Boolean{ 
    return ifNotNull(this) { it.run(check) } ?: false 
} 

Poniżej jest przykład, jak to możliwe, aby korzystać z tych funkcji:

var s: String? = null 

// ... 

if (s.isNotNullAndSatisfies{ isEmpty() }{ 
    // do something 
} 
Powiązane problemy