лучший способ нулевой проверки в Котлине?

должен ли я использовать double =, или тройной =?

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

или

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

аналогично для 'не равна':

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

или

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

3 ответов


оба подхода генерируют один и тот же байт-код, поэтому вы можете выбрать то, что вы предпочитаете.


структурное равенство a == b переведен на

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

поэтому при сравнении с null, структурного равенства a == null переводится на референтное равенство a === null.

по словам docs, нет смысла оптимизировать ваш код, поэтому вы можете использовать a == null и a != null


Примечание что если переменная является изменяемым свойством, вы не сможете smart привести ее к ее ненулевой введите внутри if оператор (потому что значение может быть изменено другим потоком), и вам придется использовать оператор безопасного вызова с let вместо.

Безопасный оператор колл - ?.

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


Вы можете использовать его в сочетании с оператором Элвис.

оператор Элвис ?: (я предполагаю, потому что знак допроса выглядит как Элвис' волосы)

a ?: println("null")

и если вы хотите запустить блок кода

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

объединение двух

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")
}

Проверьте полезные методы, это может быть полезно:

/**
 * 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
}

Ниже приведен пример использования этих функций:

var s: String? = null

// ...

if (s.isNotNullAndSatisfies{ isEmpty() }{
   // do something
}