kotlin划分可空的论点

时间:2017-10-06 09:44:52

标签: kotlin

假设我有一类以下结构

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

ab设置在其他位置,c如果至少有一个参数为{a / b,则应计算为nullnull 1}}。在Kotlin有一个简单的方法来实现这个目标吗?

我现在必须采用以下方式:

fun calculateValues() {
  ...
  val a = test.a
  val b = test.b
  if (a != null && b != null) 
    test.c = a / b
  ...
}

3 个答案:

答案 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 }