在Kotlin有一个相当于Swift代码下面?
if let a = b.val {
} else {
}
在Kotlin有一个相当于Swift代码下面?
if let a = b.val {
} else {
}
当前回答
下面是如何只在name不为空时执行代码:
var name: String? = null
name?.let { nameUnwrapp ->
println(nameUnwrapp) // not printed because name was null
}
name = "Alex"
name?.let { nameUnwrapp ->
println(nameUnwrapp) // printed "Alex"
}
其他回答
你可以像这样使用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块才会被计算。
让我们首先确保我们理解了所提供的Swift习语的语义:
if let a = <expr> {
// then-block
}
else {
// else-block
}
它的意思是:“如果<expr>结果为非nil可选,则输入then块,并将符号a绑定到未包装的值。否则进入else块。
特别注意,a只在then块内绑定。在Kotlin中,您可以通过调用很容易地得到这个
<expr>?.also { a ->
// then-block
}
你可以像这样添加一个else-block:
<expr>?.also { a ->
// then-block
} ?: run {
// else-block
}
这将导致与Swift习惯用法相同的语义。
如果让我们使用内联的乐趣,我们可以得到像Swift一样的unwring语法
inline fun <T:Any?> T?.unwrap(callback: (T)-> Unit) : Boolean {
return if (this != null) {
this?.let(callback)
true
}else {
false
}
}
用途::
val name : String? = null
val rollNo : String? = ""
var namesList: ArrayList<String>? = null
if (name.unwrap { name ->
Log.i("Dhiru", "Name have value on it $name")
})else if ( rollNo.unwrap {
Log.i("Dhiru","Roll have value on it")
}) else if (namesList.unwrap { namesList ->
Log.i("Dhiru","This is Called when names list have value ")
}) {
Log.i("Dhiru","No Field have value on it ")
}
我添加这个答案是为了澄清已接受的答案,因为它太大了,不适合评论。
这里的一般模式是,你可以使用Kotlin中可用的范围函数的任何组合,由Elvis操作符分隔,如下所示:
<nullable>?.<scope function> {
// code if not null
} :? <scope function> {
// code if null
}
例如:
val gradedStudent = student?.apply {
grade = newGrade
} :? with(newGrade) {
Student().apply { grade = newGrade }
}
在我看来,最干净的选择是这样的
迅速:
if let a = b.val {
} else {
}
科特林
b.val.also { a ->
} ?: run {
}