可空论的kotlin分裂

假设,我有一个如下结构的类

class Test { var a: Double? = null var b: Double? = null; var c: Double? = null; } 

ab被设置在其他地方,并且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