我从“Kotlin In Action”MEAP书中得到以下代码,该书应该找到该组中人的最大年龄并返回该年龄段的所有人:
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 29), Person("Bob", 31))
people.filter {it.age == people.maxBy(Person::age)}
但是,我收到以下错误:“Kotlin:运算符'=='无法应用于'kotlin.Int'和'Person?'。”如何修复代码以使其正常工作?
答案 0 :(得分:9)
使用map
+ max
代替maxBy
。同时将最大值提取到变量以避免多次计算:
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 29), Person("Bob", 31))
val maxAge = people.map(Person::age).max()
people.filter { it.age == maxAge }
答案 1 :(得分:5)
Kotlin的maxBy
函数(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/max-by.html)返回T?
一个可迭代的T(就像一个T列表)。
因此,people.maxBy(Person::age)
返回类型为Person?
的值,但您尝试将其与整数进行比较。如果您愿意,可以比较此Person?
的年龄:
people.filter { it.age == people.maxBy(Person::age)?.age }
将为您的样本输出[Person(name=Bob, age=31)]
。
答案 2 :(得分:0)
我会做这样的事情:
list = people.groupBy{ it.age }.maxBy{ it.key }?.value