Kotlin 布尔返回函数

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)

Ten*_*r04 7

由于此函数仅返回 true 或 false,因此您不应将变量设置为可为test空。但是如果您删除?和 ,编译器会抱怨= null,因为它不能保证 for 循环中的代码将被调用(因为列表可能为空)。

\n\n

至于为什么它\xe2\x80\x99s给你错误的结果,它\xe2\x80\x99s因为你\xe2\x80\x99正在改变test列表中每个项目的值,所以最终值仅取决于列表中的最后一个元素。另外,如果列表为空,test则将保持为空,并且您\xe2\x80\x99在使用时会出现异常test!!

\n\n

我不知道\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\n
var test = false // not nullable\nfor (i in list)\n    if (i == "a") {\n        test = true\n        break\n    }\nreturn test\n
Run Code Online (Sandbox Code Playgroud)\n\n

附带说明一下,Kotlin 有一个 List 的高阶函数,用于检查满足 lambda 的任何元素,因此上面的代码可以替换为

\n\n
return list.any { it == "a" }\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一个旁注:如果您根据某些条件设置布尔值,那么 when 语句就太过分了,并使您的代码更加复杂。您可以将 when 语句替换为test = i == "a"并具有等效的行为(尽管正如您所发现的,这不是 \xe2\x80\x99t 正确的行为)。

\n