use*_*022 0 boolean function boolean-expression kotlin
我对Boolean返回类型函数做了一些研究,发现使用可为空的检查更安全。
现在编译器不喜欢我所做的。
我也尝试使用 if 语句,但它以某种方式只返回 false。
谁能向我解释一下!
fun check(list:ArrayList<String>): Boolean {
var test: Boolean?= null
for (i in list) {
when (i=="a") {
true -> test == true
false -> test == false
}
}
return test!!
}
Run Code Online (Sandbox Code Playgroud)
由于此函数仅返回 true 或 false,因此您不应将变量设置为可为test空。但是如果您删除?和 ,编译器会抱怨= null,因为它不能保证 for 循环中的代码将被调用(因为列表可能为空)。
至于为什么它\xe2\x80\x99s给你错误的结果,它\xe2\x80\x99s因为你\xe2\x80\x99正在改变test列表中每个项目的值,所以最终值仅取决于列表中的最后一个元素。另外,如果列表为空,test则将保持为空,并且您\xe2\x80\x99在使用时会出现异常test!!。
我不知道\xe2\x80\x99 是否\xe2\x80\x99 试图查看列表中的任何元素是否为\xe2\x80\x9ca\xe2\x80\x9d 或者所有元素是否为\xe2\x80\x9ca \xe2\x80\x9d,但为了讨论起见,我\xe2\x80\x99ll 假设它是第一个。所以这里的策略是将 false 设置为默认值,如果发现任何 \xe2\x80\x9ca\xe2\x80\x9d 元素,则将其更改为 true。一旦找到,\xe2\x80\x99s 就没有理由继续检查,这样你就可以跳出循环。
\n\nvar test = false // not nullable\nfor (i in list)\n if (i == "a") {\n test = true\n break\n }\nreturn test\nRun Code Online (Sandbox Code Playgroud)\n\n附带说明一下,Kotlin 有一个 List 的高阶函数,用于检查满足 lambda 的任何元素,因此上面的代码可以替换为
\n\nreturn list.any { it == "a" }\nRun Code Online (Sandbox Code Playgroud)\n\n另一个旁注:如果您根据某些条件设置布尔值,那么 when 语句就太过分了,并使您的代码更加复杂。您可以将 when 语句替换为test = i == "a"并具有等效的行为(尽管正如您所发现的,这不是 \xe2\x80\x99t 正确的行为)。
| 归档时间: |
|
| 查看次数: |
4566 次 |
| 最近记录: |