运算符调用对应于点限定调用 'List.min().compareTo(500)',这在可为空的接收器 'List.min()' 上是不允许的



以下函数会产生错误。如何在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")
}

最新更新