仅在右侧不为空时分配的更好方法是?

时间:2017-12-24 07:05:39

标签: kotlin kotlin-null-safety

在Kotlin中,我想仅在另一个变量不为空时才进行赋值(否则,不执行操作)。我可以想到两种简洁的方法:

fun main(args: Array<String>) {
    var x: Int? = null
    var n = 0

    // ... do something ...

    x?.let { n = it }  // method 1
    n = x ?: n         // method 2
}

然而,考虑到我必须做的频率,他们并不觉得足够简洁。第一种方法似乎有点矫枉过正。第二种方法是在?:之后要求表达式。

我怀疑必须有更好的方式,例如n =? x?还是n = x??有吗?

2 个答案:

答案 0 :(得分:1)

尝试infix来'模拟自定义操作'

// define this
infix fun <T > T.assignFromNotNull(right: T): T = right ?: this

///////////////////////////////////////////////////////////
// Demo using

// Now, Kotlin infix-style
fooA assignFromNotNull fooB
barA assignFromNotNull barB
bazA assignFromNotNull bazB

// Old code, Java if-style
if (fooB != null) {
    fooA = fooB;
}
if (barB != null) {
    barA = barB;
}
if (bazB != null) {
    bazA = bazB
}

答案 1 :(得分:0)

有以下内容:

val x: Int? = null
val n: Int = x ?: return

尽管可能未分配n,但此编译完全正常。即使在“分配”之后使用n的来电也是允许的,例如println(n),因为编译器只知道nInt而且没问题。但是,永远不会调用赋值后的任何行,因为我们从作用域return开始。根据你的需要,这是一个无操作。我们无法继续,因为无法分配n,所以只需返回。

另一个选项是val n: Int = x!!,如果应该在其他地方处理NullPointerException,则会x == null。我不推荐这种做法,因为Kotlin提供了更清洁的方法来处理可空性。