Каков наиболее читаемый способ суммировать два обнуляемых Int в Kotlin? - PullRequest
1 голос
/ 06 мая 2020

Я попытался сделать что-то вроде следующего:

val a: Int? = 1
val b: Int? = 1

a?.plus(b)

, но он не компилируется, потому что plus ожидает Int.

Я также пытался создать biLet function:

fun <V1, V2, V3> biLet(a: V1?, b: V2?, block: (V1, V2) -> V3): V3? {
    return a?.let {
        b?.let { block(a, b) }
    }
}

и используйте его так:

val result = biLet(a, b) { p1, p2 -> p1 + p2 }

, но, похоже, много работы для чего-то, казалось бы, простого. Есть ли решение попроще?

Ответы [ 2 ]

7 голосов
/ 06 мая 2020

К сожалению, в стандартной библиотеке нет ничего, что могло бы суммировать два целых числа, допускающих значение NULL.

Однако вы можете создать operator fun для обнуляемого Int?:

operator fun Int?.plus(other: Int?): Int? = if (this != null && other != null) this + other else null

И затем вы можете использовать его, как ненулевую версию:

val a: Int? = 2
val b: Int? = 3
val c = a + b

Если вы не хотите создавать для него функцию, вы всегда можете использовать ее тело для обрабатывать возможность нулевого значения двух целых чисел.

3 голосов
/ 06 мая 2020

Что ж, для меня это выглядит более читабельным,

val result = if (a != null && b != null) a+b else null

И когда один из них равен нулю, другой не равен нулю, и вам просто нужно ненулевое значение, тогда может быть так:

val result = (a?:0)+(b?:0)
...