在Kotlin无效检查的最佳方式?

时间:2016-05-14 20:33:36

标签: kotlin kotlin-null-safety

我应该使用双倍=,还是三倍=

if(a === null)  {
//do something
}

if(a == null)  {
//do something
}

同样适用于' not equals':

if(a !== null)  {
//do something
}

if(a != null)  {
//do something
}

5 个答案:

答案 0 :(得分:81)

结构平等a == b被翻译为

a?.equals(b) ?: (b === null)

因此,与null进行比较时,结构相等a == null将转换为引用相等a === null

根据docs,优化代码没有意义,因此您可以使用a == nulla != 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)

Kotlin处理null的方式

让功能

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"
}