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

Yus*_*eff 4 kotlin

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

这是错误:

Operator call corresponds to a dot-qualified call 'List.min().compareTo(500)' which is not allowed on a nullable receiver 'List.min()'.
Run Code Online (Sandbox Code Playgroud)

帮助我处理可空类型。谢谢

gid*_*dds 6

这里的问题是:如果您的列表为空,您希望发生什么?

\n

如果列表有一个或多个项目,并且这些项目是可比较的,那么您总是可以找到最小值。\ xc2 \xa0(它不必是唯一的。)但是如果列表没有项目,则没有最低限度。\xc2\xa0 那么你想发生什么?\xc2\xa0 你想继续使用 \xe2\x80\x98default\xe2\x80\x99 值吗?\xc2\xa0 或者跳过该块?\xc2\ xa0 还是其他什么?

\n

如果你想要一个默认值,那么你可以使用 elvis 运算符:

\n
if ((list.minOrNull() ?: 0) < 500)\n    println("Yes you can buy from this shop")\n
Run Code Online (Sandbox Code Playgroud)\n

如果列表为空,则替换该值0。\xc2\xa0(它不必为零;任何值都可以。\xc2\xa0 事实上,只要它是可比较的,这可以适用于任何类型。)

\n

或者您可以显式检查列表是否为空:

\n
if (list.isEmpty()) {\n    // Do something else\n} else if (list.minOrNull()!! < 500)\n    println("Yes you can buy from this shop")\n
Run Code Online (Sandbox Code Playgroud)\n

!!空断言运算符在这里起作用,但它是一种代码味道。\xc2\xa0(当你更改周围的代码时很容易错过;然后它可能会抛出 NullPointerException。)\xc2\xa0\xc2\xa0所以它更安全处理 null.\xc2\xa0 也许最惯用的方法是let()

\n
list.minOrNull().let {\n    if (it == null) {\n        // Do something else\n    } else if (it < 500)\n        println("Yes you can buy from this shop")\n}\n
Run Code Online (Sandbox Code Playgroud)\n

<那里允许进行检查,因为此时编译器知道it不能为空。)

\n

或者,如果您只是想完全避免检查,请使用?.安全调用,以便let()仅在非空值上调用:

\n
list.minOrNull()?.let {\n    if (it < 500)\n        println("Yes you can buy from this shop")\n}\n
Run Code Online (Sandbox Code Playgroud)\n