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

if let a = b.val {

} else {

}

当前回答

上面有两个答案,都得到了很多人的接受:

str ?。让{}?:运行{} str ?。还有{}?:run {}

两者似乎都适用于大多数用法,但#1在下面的测试中会失败:

第二条似乎更好。

其他回答

这是我的变体,仅限于非常常见的“if not null”情况。

首先,在某个地方定义它:

inline fun <T> ifNotNull(obj: T?, block: (T) -> Unit) {
    if (obj != null) {
        block(obj)
    }
}

它可能应该是内部的,以避免冲突。

现在,转换这个Swift代码:

if let item = obj.item {
    doSomething(item)
}

到这个Kotlin代码:

ifNotNull(obj.item) { item -> 
    doSomething(item)
}

请注意,在Kotlin中,你可以删除参数并使用它:

ifNotNull(obj.item) {
    doSomething(it)
}

但是如果代码块超过1-2行,最好是显式的。

这是我所能找到的最相似的斯威夫特。

在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

If let语句

Swift if let可选绑定(称为if-let语句)用于提取存在的非可选值,或者如果值为nil则不执行任何操作。

斯威夫特的if-let声明:

let b: Int? = 50

if let a: Int = b {
    print("Good news!")
} else {
    print("Equal to 'nil' or not set")
}

/*  RESULT: Good news!  */

在Kotlin中,就像在Swift中一样,为了避免在不期望的情况下试图访问空值而导致的崩溃,提供了一个特定的语法(如第二个例子中的b.let{})来正确地展开可空类型:

Kotlin相当于Swift的if-let语句:

val b: Int? = null
val a = b

if (a != null) { 
    println("Good news!")
} else { 
    println("Equal to 'null' or not set")
}

/*  RESULT: Equal to 'null' or not set  */

Kotlin的let方法与安全调用操作符?:结合使用时,提供了一种处理可空表达式的简洁方法。

Kotlin的内联let函数和Swift的nil合并运算符的Elvis运算符:

val b: Int? = null

val a = b.let { nonNullable -> nonNullable } ?: "Equal to 'null' or not set"
println(a)

/*  RESULT: Equal to 'null' or not set  */

警卫让声明

Swift中的guard-let语句简单而强大。它检查某些条件,如果计算结果为false,则执行else语句,该语句通常会退出一个方法。

让我们来看看斯威夫特的这句话:

let b: Int? = nil

func method() {
    guard let a: Int = b else {
        print("Equal to 'nil' or not set")
        return
    }
    print("Good news!")
}
method()

/*  RESULT: Equal to 'nil' or not set  */

Kotlin对霉霉的保守声明也有类似的影响:

与Swift不同的是,在Kotlin中根本没有警卫声明。但是,您可以使用Elvis Operator - ?:来获得类似的效果。

val b: Int? = 50

fun method() {
    val a = b ?: return println("Equal to 'null' or not set")
    return println("Good news!")
}
method()

/*  RESULT: Good news!  */

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

yourOptionalString ?: return

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

你可以像这样使用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块才会被计算。