在 Kotlin 中对两个可为 null 的 Int 求和的最易读的方法是什么?
What is the most readable way to sum two nullable Int in Kotlin?
我尝试执行如下操作:
val a: Int? = 1
val b: Int? = 1
a?.plus(b)
但它无法编译,因为 plus
需要一个 Int
。
我还尝试创建一个 biLet 函数:
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 }
但是看似简单的事情似乎需要做很多工作。有没有更简单的解决方案?
不幸的是,标准库中没有任何东西可以对两个可为 null 的整数求和。
但是,您可以为可为 null 的 Int?
创建一个 operator fun
:
operator fun Int?.plus(other: Int?): Int? = if (this != null && other != null) this + other else null
然后就可以像not-null版本一样正常使用了:
val a: Int? = 2
val b: Int? = 3
val c = a + b
如果你不想为它创建一个函数,你总是可以使用它的主体来处理两个整数的可空性。
好吧,对我来说这个看起来更具可读性,
val result = if (a != null && b != null) a+b else null
当一个为 null 时,另一个为 not-null,而您只想要非 null 值,那么可能是这样的:
val result = (a?:0)+(b?:0)
答案实际上取决于添加空值的预期输出是什么。
应该4 + null = null
还是4 + null = 4
?那么 null + null
呢?
就我而言,我所追求的是:
4 + 3 = 7
4 + null = 4
null + null = null
下面的函数实现了这个行为
private fun addNullable(a: Int?, b: Int?): Int? {
return if (a == null && b == null) {
null
} else {
(a ?: 0) + (b ?: 0)
}
}
...
val a: Int? = 1
val b: Int? = 1
val result = addNullable(a, b)
或者,如果您希望在任何地方都有相同的行为,您可以使用 operator overload。这样做的缺点是在使用时不清楚它是自定义行为。
operator fun Int?.plus(other: Int?): Int? {
return if (this == null && other == null) {
null
} else {
(a ?: 0) + (b ?: 0)
}
}
...
val a: Int? = 1
val b: Int? = 1
val result = a + b
listOfNotNull(int1, int2, int3).sumOfOrNull { it }
哪里的int是Int?
我尝试执行如下操作:
val a: Int? = 1
val b: Int? = 1
a?.plus(b)
但它无法编译,因为 plus
需要一个 Int
。
我还尝试创建一个 biLet 函数:
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 }
但是看似简单的事情似乎需要做很多工作。有没有更简单的解决方案?
不幸的是,标准库中没有任何东西可以对两个可为 null 的整数求和。
但是,您可以为可为 null 的 Int?
创建一个 operator fun
:
operator fun Int?.plus(other: Int?): Int? = if (this != null && other != null) this + other else null
然后就可以像not-null版本一样正常使用了:
val a: Int? = 2
val b: Int? = 3
val c = a + b
如果你不想为它创建一个函数,你总是可以使用它的主体来处理两个整数的可空性。
好吧,对我来说这个看起来更具可读性,
val result = if (a != null && b != null) a+b else null
当一个为 null 时,另一个为 not-null,而您只想要非 null 值,那么可能是这样的:
val result = (a?:0)+(b?:0)
答案实际上取决于添加空值的预期输出是什么。
应该4 + null = null
还是4 + null = 4
?那么 null + null
呢?
就我而言,我所追求的是:
4 + 3 = 7
4 + null = 4
null + null = null
下面的函数实现了这个行为
private fun addNullable(a: Int?, b: Int?): Int? {
return if (a == null && b == null) {
null
} else {
(a ?: 0) + (b ?: 0)
}
}
...
val a: Int? = 1
val b: Int? = 1
val result = addNullable(a, b)
或者,如果您希望在任何地方都有相同的行为,您可以使用 operator overload。这样做的缺点是在使用时不清楚它是自定义行为。
operator fun Int?.plus(other: Int?): Int? {
return if (this == null && other == null) {
null
} else {
(a ?: 0) + (b ?: 0)
}
}
...
val a: Int? = 1
val b: Int? = 1
val result = a + b
listOfNotNull(int1, int2, int3).sumOfOrNull { it }
哪里的int是Int?