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

我从“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:Operator'=='不能应用于'kotlin.Int'和'Person?'。 如何修复代码以使其工作?

Kotlin的maxBy函数( https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/max-by.html )会返回T? 对于T的迭代(如T的列表)。

因此, people.maxBy(Person::age)返回Person?类型的值Person? ,但是你想把它和一个整数进行比较。 你可以比较这个Person?的年龄Person? 如果你希望:

 people.filter { it.age == people.maxBy(Person::age)?.age } 

将输出[Person(name=Bob, age=31)]为您的示例。

使用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 } 

我会做这样的事情:

 list = people.groupBy{ it.age }.maxBy{ it.key }?.value