假设我有一类以下结构
class Test {
var a: Double? = null
var b: Double? = null;
var c: Double? = null;
}
a
和b
设置在其他位置,c
如果至少有一个参数为{a / b
,则应计算为null
或null
1}}。在Kotlin有一个简单的方法来实现这个目标吗?
我现在必须采用以下方式:
fun calculateValues() {
...
val a = test.a
val b = test.b
if (a != null && b != null)
test.c = a / b
...
}
答案 0 :(得分:2)
class Test {
var a: Double? = null
var b: Double? = null
val c: Double? // It should be val as it is readonly
get() {
// This is need as a & b are mutable
val dividend = a
val divisor = b
if (dividend == null || divisor == null)
return null
return dividend / divisor
}
}
答案 1 :(得分:0)
由于逻辑在Test
类之外,因此在进行操作之前没有发现检查可空性的问题。无论如何,if else
也是Kotlin的一个表达,所以你可以做到以下几点:
val a = test.a
val b = test.b
t.c = if (a != null && b != null) a / b else null
答案 2 :(得分:0)
test.apply {
c = if (a==null || b==null) null else a/b
}
当然,它可以作为c的吸气剂包含在内(这反过来又避免了将c存储为字段):
class Test {
var a: Double? = null
var b: Double? = null
var c: Double? = null
get() = if (a==null || b==null) null else a/b
}
如果Test不属于您的类,您可以随时使用扩展功能:
fun Test.updateC() {
c = if (a==null || b==null) null else a/b
}
然后可以在Test实例上调用它,就像Test类的任何其他函数一样:test.updateC()
如果你需要在计算a / b时确定可空性,你应该使用临时变量,如下面的@Joshua答案中所示。或者还阅读以下Kotlin讨论:https://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946/11和票证:https://youtrack.jetbrains.com/issue/KT-20294
我特别喜欢具有功能的可重用解决方案:
fun notNull(vararg args: Any?, action: () -> Unit) {
when {
args.filterNotNull().size == args.size -> action()
}
}
可以用作:
c = null
notNull(a, b) { c = a/b }