лучший способ нулевой проверки в Котлине?
должен ли я использовать 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
}