可空论的kotlin分裂
假设,我有一个如下结构的类
class Test { var a: Double? = null var b: Double? = null; var c: Double? = null; }
a
和b
被设置在其他地方,并且c
应该被计算为a / b
或者null
如果至少一个参数是null
。 有没有一种简单的方法可以在Kotlin中实现这一点?
我现在必须这样做:
fun calculateValues() { ... val a = test.a val b = test.b if (a != null && b != null) test.c = a / b ... }
test.apply { c = if (a==null || b==null) null else a/b }
当然,这可以作为c的getter(这又避免了将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 }
如果“测试”不属于您的类别,则始终可以使用扩展function:
fun Test.updateC() { c = if (a==null || b==null) null else a/b }
然后可以在Test实例上调用,就像Test类的任何其他函数一样: test.updateC()
如果您在计算a / b时需要确定可空性,您应该使用下面的@Joshua答案中指出的临时variables。 或者阅读以下Kotlin讨论: https ://discuss.kotlinlang.org/t/kotlin-null-check-for-multiple-nullable-vars/1946/11和ticket: https : //youtrack.jetbrains.com/问题/ KT-20294
我特别喜欢带有函数的可重用解决方案:
fun notNull(vararg args: Any?, action: () -> Unit) { when { args.filterNotNull().size == args.size -> action() } }
这可以用作:
c = null notNull(a, b) { c = a/b }
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 } }
由于逻辑在Test
类之外,所以在执行操作之前我没有发现检查可空性的问题。 无论如何, if else
也是Kotlin的一个expression,所以你可以做到以下几点:
val a = test.a val b = test.b tc = if (a != null && b != null) a / b else null