Лучший способ назначить, только если правая сторона не равна нулю?

В 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 предлагает более чистые методы для обработки обнуляемости.

Другие вопросы по тегам