Лучший способ назначить, только если правая сторона не равна нулю?
В Kotlin я хочу сделать присваивание только в том случае, если другая переменная не равна нулю (в противном случае, нет операции). Я могу придумать два лаконичных способа:
fun main(args: Array<String>) {
var x: Int? = null
var n = 0
// ... do something ...
x?.let { n = it } // method 1
n = x ?: n // method 2
}
Тем не менее, они не чувствуют себя достаточно краткими, учитывая частоту их выполнения. Первый метод кажется излишним. Второй метод требует ныне выражения после ?:
,
Я подозреваю, что должен быть лучший способ, что-то вроде n =? x
? Или же n = x?
? Есть?
2 ответа
Пытаться infix
"имитировать пользовательские операции с кадрами"
// define this
infix fun <T > T.assignFromNotNull(right: T): T = right ?: this
///////////////////////////////////////////////////////////
// Demo using
// Now, Kotlin infix-style
fooA assignFromNotNull fooB
barA assignFromNotNull barB
bazA assignFromNotNull bazB
// Old code, Java if-style
if (fooB != null) {
fooA = fooB;
}
if (barB != null) {
barA = barB;
}
if (bazB != null) {
bazA = bazB
}
Есть следующее:
val x: Int? = null
val n: Int = x ?: return
Это прекрасно компилируется, хотя n
не может быть назначен Даже звонки, которые используют n
после того, как его "назначение" разрешено, например, println(n)
потому что компилятор знает только это n
является Int
и это нормально. Тем не менее, любые строки после назначения никогда не будут вызваны, потому что мы return
из сферы. В зависимости от того, что вы хотите, это не работает. Мы не можем продолжать, потому что n
не может быть назначен, так что просто вернитесь.
Другой вариант val n: Int = x!!
который бросит NullPointerException
если x == null
это должно быть обработано в другом месте. Я не рекомендую эту практику, потому что Kotlin предлагает более чистые методы для обработки обнуляемости.