Kotlin:运算符'=='不能应用于'kotlin.Int'和'Person?'错误

时间:2016-04-29 23:19:03

标签: kotlin

我从“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?'。”如何修复代码以使其正常工作?

3 个答案:

答案 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