我对布尔返回类型函数进行了一些研究,发现使用可空检查更安全。我有一些理解问题,编译器不喜欢我的工作。我也尝试了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!!
}
答案 0 :(得分:2)
由于此函数仅返回true或false,因此您不应该使变量test
为空。但是,如果您删除?
和= null
,编译器会抱怨,因为它不能保证您的for循环中的代码会被调用(因为列表可能为空)。
为什么会给您错误的结果,这是因为您要更改列表中每个项目的test
的值,所以最终值仅取决于列表中的最后一个元素。另外,如果列表为空,则test
将保持为空,并且在使用test!!
时会出现异常。
我不知道您是否要查看列表中的任何元素是否为“ a”,或者 all 元素是否为“ a”,但是对于为了讨论起见,我假设这是第一个。因此,此处的策略是将false设置为默认值,如果找到任何“ a”元素,请将其更改为true。一旦找到一个,便没有理由继续检查,因此您可以跳出循环。
var test = false // not nullable
for (i in list)
if (i == "a") {
test = true
break
}
return test
作为附带说明,Kotlin为List提供了一个高阶函数,该函数检查是否满足lambda的任何元素,以便可以将上述代码替换为
return list.any { it == "a" }
另一点说明:如果您基于某些条件设置布尔值,则when语句会显得过大,并使您的代码更加复杂。您可以用test = i == "a"
替换when语句,并且具有相同的行为(尽管您发现,开始时这不是正确的行为)。