在Kotlin有一个相当于Swift代码下面?

if let a = b.val {

} else {

}

当前回答

在我看来,最干净的选择是这样的

迅速:

if let a = b.val {

} else {

}

科特林

b.val.also { a ->

} ?: run {

}

其他回答

你可以像这样使用let函数:

val a = b?.let {
    // If b is not null.
} ?: run {
    // If b is null.
}

注意,只有在需要代码块时才需要调用run函数。如果你在elvis操作符(?:)后面只有一个线性程序,你可以删除运行块。

注意,如果b为空,或者let-block为空,则运行块将被求值。

因此,您通常只需要一个if表达式。

val a = if (b == null) {
    // ...
} else {
    // ...
}

在这种情况下,只有当b不为空时,else块才会被计算。

在kotlin中也有类似的方法来实现Swift的if-let风格

if (val a = b) {
    a.doFirst()
    a.doSecond()
}

您还可以分配多个可空值

if (val name = nullableName, val age = nullableAge) {
    doSomething(name, age)
}

如果可空值被使用超过1次,这种方法将更适合。在我看来,它从性能方面有所帮助,因为可为空的值将只检查一次。

来源:Kotlin Discussion

Any的问题是什么?让{}?:运行{}结构是:

它只允许每条语句进行一次非空检查 如果let块返回null,运行块无论如何都会被求值 不可能在switch/when样式中执行多次检查

解决这些问题的一个解决方案是定义如下的函数:

private inline fun <A> ifNotNull(p1: A?, block: (A) -> Unit): Unit? {
    if (p1 != null) {
        return block.invoke(p1)
    }
    return null
}

private inline fun <A, B> ifNotNull(p1: A?, p2: B?, block: (A, B) -> Unit): Unit? {
    if (p1 != null && p2 != null) {
        return block.invoke(p1, p2)
    }
    return null
}

private inline fun <A, B, C> ifNotNull(p1: A?, p2: B?, p3: C?, block: (A, B, C) -> Unit): Unit? {
    if (p1 != null && p2 != null && p3 != null) {
        return block.invoke(p1, p2, p3)
    }
    return null
}

这将允许这样的语句:

ifNotNull(a, b) { a, b ->
    // code when a, b are not null
} ?:
ifNotNull(c) { c ->
    // code when a, b are null and c not null
} ?: 
ifNotNull(d, e, f) { d, e, f ->
    // code when a, b, c are null and d, e, f not null
} ?: run {
    // code which should be performed if a, b, c, d, e and f are null
}

唯一需要注意的是,与Swift的if let相比,如果在循环中执行,则不支持continue和break语句。

也许我已经很晚了,但最简单的方法是打开和选择

yourOptionalString ?: return

这是下面的所有行都将有解开的字符串

在我看来,最干净的选择是这样的

迅速:

if let a = b.val {

} else {

}

科特林

b.val.also { a ->

} ?: run {

}