【问题标题】:why data receiver maxByOrNull of class requires validation of not being null?为什么类的数据接收器 maxByOrNull 需要验证不为空?
【发布时间】:2022-01-02 16:35:03
【问题描述】:

我是 kotlin 的新手,我有一个问题。

好吧,代码如下:

   data class People(val name: String?=null, val age: Int?=null )

   fun main(){
       
   val people = listOf(People("Alice"),People("John",32))
   val older = people.maxByOrNull{ it.age ?: 0 }
   
   // val resultadoFinal = maisVelho
   println("${older?.name}")
    
   println("${people[0].name}")
}

如果在println("${older?.name}") 中取出'?',你会得到这个错误:

Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type People?

我的理解是,这意味着 maxByOrNull 返回的内容可能为 null,因此您必须验证它是否为 null。 我的问题是:这样对吗?

另外,阅读有关 maxByOrNull 的信息 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/max-by-or-null.html

有这个部分:

val emptyList = emptyList<Pair<String, Int>>()
val emptyMax = emptyList.maxByOrNull { it.second }
println(emptyMax) // null

这部分emptyList&lt;Pair&lt;String, Int&gt;&gt;()对我来说很奇怪。那是什么?我知道他正在创建一个空列表,但这是什么语言?我会进一步了解这个吗?这个 Pair 东西,为什么他把 String 和 Int 放在里面?在kotlin中创建一个空列表没有更简单的方法吗?

嗯,就是这样。谢谢。

【问题讨论】:

  • 阅读以下内容:kotlinlang.org/docs/null-safety.html - 基本上,Kotlin 强制执行一个系统,您可以在该系统中明确地说绝对不会为空(如果那样的话它会崩溃不是真的),或者它们可以为空,并且您需要在任何可能出现问题的地方处理它。它很有用,你会习惯的!名为 *OrNull* 的函数显式返回 null 作为“失败”结果,这使您可以轻松提供后备值,或仅对实际(非 null)结果运行后续步骤

标签: java kotlin validation null empty-list


【解决方案1】:

简而言之,是的,请纠正您对maxByOrNull 的看法。如果列表本身为空,则不会取回任何元素。

emptyList 函数只是一个方便的函数,用于创建一个(类型化的)空列表,其中包含 0 个 Pair&lt;String,Int&gt; 类型的元素(参见 Kotlin docs for emptyList)。

可以使用val emptyList = null 代替空列表,但会强制您在执行maxByOrNull 之前检查空值:val emptyMax = emptyList?.maxByOrNull { it.second }。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2020-11-16
    • 2020-01-19
    • 2018-11-28
    相关资源
    最近更新 更多