我应该使用双倍=
,还是三倍=
?
if(a === null) {
//do something
}
或
if(a == null) {
//do something
}
同样适用于' not equals':
if(a !== null) {
//do something
}
或
if(a != null) {
//do something
}
答案 0 :(得分:81)
结构平等a == b
被翻译为
a?.equals(b) ?: (b === null)
因此,与null
进行比较时,结构相等a == null
将转换为引用相等a === null
。
根据docs,优化代码没有意义,因此您可以使用a == null
和a != null
注意如果变量是一个可变属性,您将无法在if
语句内智能地将其转换为非可空类型(因为该值可能已经由另一个线程修改)并且您必须使用let
的安全呼叫运算符。
安全通话运营商 ?.
a?.let {
// not null do something
println(it)
println("not null")
}
您可以将它与Elvis操作符结合使用。
猫王操作员?:
(我猜测是因为询问标记看起来像猫王头发
a ?: println("null")
如果你想运行一段代码
a ?: run {
println("null")
println("The King has left the building")
}
合并两个
a?.let {
println("not null")
println("Wop-bop-a-loom-a-boom-bam-boom")
} ?: run {
println("null")
println("When things go null, don't go with them")
}
答案 1 :(得分:31)
两种方法都生成相同的字节码,因此您可以选择自己喜欢的任何方式。
答案 2 :(得分:3)
检查有用的方法,它可能很有用:
/**
* Performs [R] when [T] is not null. Block [R] will have context of [T]
*/
inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? {
return input?.let(callback)
}
/**
* Checking if [T] is not `null` and if its function completes or satisfies to some condition.
*/
inline fun <T: Any> T?.isNotNullAndSatisfies(check: T.() -> Boolean?): Boolean{
return ifNotNull(this) { it.run(check) } ?: false
}
以下是如何使用这些功能的可能示例:
var s: String? = null
// ...
if (s.isNotNullAndSatisfies{ isEmpty() }{
// do something
}
答案 3 :(得分:3)
@Benito Bertoli的补充,
组合实际上不同于if-else
<uses-permission
android:name="android.permission.RECEIVE_SMS"
tools:node="remove" />
结果是:
"test" ?. let {
println ( "1. it=$it" )
} ?: let {
println ( "2. it is null!" )
}
但是如果:
1. it=test
结果是:
"test" ?. let {
println ( "1. it=$it" )
null // finally returns null
} ?: let {
println ( "2. it is null!" )
}
此外,如果先使用猫王:
1. it=test
2. it is null!
结果是:
null ?: let {
println ( "1. it is null!" )
} ?. let {
println ( "2. it=$it" )
}
答案 4 :(得分:3)
让功能
user?.let {
//Work with non-null user
handleNonNullUser(user)
}
提早退出
fun handleUser(user : User?) {
user ?: return //exit the function if user is null
//Now the compiler knows user is non-null
}
不可改变的阴影
var user : User? = null
fun handleUser() {
val user = user ?: return //Return if null, otherwise create immutable shadow
//Work with a local, non-null variable named user
}
默认值
fun getUserName(): String {
//If our nullable reference is not null, use it, otherwise use non-null value
return userName ?: "Anonymous"
}