以下函数会产生错误。如何在 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)
帮助我处理可空类型。谢谢
这里的问题是:如果您的列表为空,您希望发生什么?
\n如果列表有一个或多个项目,并且这些项目是可比较的,那么您总是可以找到最小值。\ xc2 \xa0(它不必是唯一的。)但是如果列表没有项目,则没有最低限度。\xc2\xa0 那么你想发生什么?\xc2\xa0 你想继续使用 \xe2\x80\x98default\xe2\x80\x99 值吗?\xc2\xa0 或者跳过该块?\xc2\ xa0 还是其他什么?
\n如果你想要一个默认值,那么你可以使用 elvis 运算符:
\nif ((list.minOrNull() ?: 0) < 500)\n println("Yes you can buy from this shop")\nRun Code Online (Sandbox Code Playgroud)\n如果列表为空,则替换该值0。\xc2\xa0(它不必为零;任何值都可以。\xc2\xa0 事实上,只要它是可比较的,这可以适用于任何类型。)
或者您可以显式检查列表是否为空:
\nif (list.isEmpty()) {\n // Do something else\n} else if (list.minOrNull()!! < 500)\n println("Yes you can buy from this shop")\nRun Code Online (Sandbox Code Playgroud)\n非!!空断言运算符在这里起作用,但它是一种代码味道。\xc2\xa0(当你更改周围的代码时很容易错过;然后它可能会抛出 NullPointerException。)\xc2\xa0\xc2\xa0所以它更安全处理 null.\xc2\xa0 也许最惯用的方法是let():
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}\nRun Code Online (Sandbox Code Playgroud)\n(<那里允许进行检查,因为此时编译器知道it不能为空。)
或者,如果您只是想完全避免检查,请使用?.安全调用,以便let()仅在非空值上调用:
list.minOrNull()?.let {\n if (it < 500)\n println("Yes you can buy from this shop")\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6626 次 |
| 最近记录: |