Look at the following code running in Kotlin REPL:
>>> null.takeIf({1==2})
res4: kotlin.Nothing? = null
Run Code Online (Sandbox Code Playgroud)
Why this don't cause NullPointerException?
您的代码不会引起NullPointerException,因为takeIf它是扩展功能。
扩展函数被转换为方法接收器,第一个参数是调用函数的对象。
因此null.takeIf { false },您可能想知道为什么以下函数没有引发NullPointerException 而不是(简化示例):
fun <T> takeIf(me: T, predicate: (T) -> Boolean): T? {
...
}
Run Code Online (Sandbox Code Playgroud)
好吧,为此,我们需要研究takeIf()实现(删除注释和协定):
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
return if (predicate(this)) this else null
}
Run Code Online (Sandbox Code Playgroud)
因此,如果您的谓词为假(如您的示例中的1==2),则它只会短路并返回null。
那是什么true呢?我们最终会得到一个NullPointer吗?
不:
val nothing: Nothing? = null.takeIf {
true
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |