以下函数会产生错误。如何在if/for语句中使用let((或类似的null检查函数。
这是我的代码:
fun main() {
var List = listOf<Int>(201, 53 ,5 ,556 ,70 , 9999)
var budget: Int = 500
if(List.min() < 500) { // this line produces the error
println("Yes you can buy from this shop")
}
}
这是一个错误:
Operator call corresponds to a dot-qualified call 'List.min().compareTo(500)' which is not allowed on a nullable receiver 'List.min()'.
帮助我处理可为null的类型。谢谢
这里的问题是:如果您的列表为空,您希望发生什么
如果一个列表有一个或多个项目,并且这些项目是可比较的,那么您总是可以找到最小值。(它不一定是唯一的。(但是如果列表中没有项目,那么就没有最小值那么你想发生什么呢?是否使用"默认"值继续?还是跳过那个街区?还是别的什么?
如果你想要一个默认值,那么你可以使用elvis操作符:
if ((list.minOrNull() ?: 0) < 500)
println("Yes you can buy from this shop")
如果列表为空,则替换值0
。(它不一定是零;任何值都可以。事实上,只要它是可比较的,它就可以用于任何类型。(
或者,您可以对列表是否为空进行明确检查:
if (list.isEmpty()) {
// Do something else
} else if (list.minOrNull()!! < 500)
println("Yes you can buy from this shop")
!!
非null断言操作符在这里工作,但它只是一种代码气味。(当您更改周围的代码时,很容易错过;然后它可能会抛出NullPointerException。(因此,处理null更安全。也许最惯用的方法是使用let()
:
list.minOrNull().let {
if (it == null) {
// Do something else
} else if (it < 500)
println("Yes you can buy from this shop")
}
(允许<
检查,因为此时编译器知道it
不能为空。(
或者,如果您只是想完全避免检查,请使用?.
安全调用,以便仅对非null值调用let()
:
list.minOrNull()?.let {
if (it < 500)
println("Yes you can buy from this shop")
}