2016-04-29 6 views
2

Ich habe den folgenden Code aus dem „Kotlin In Aktion“ MEAP Buch, das das maximale Alter der Personen in der Gruppe finden soll und kehren alle Menschen in diesem Alter:Kotlin: Operator '==' kann nicht auf 'kotlin.Int' und 'Person?' Angewendet werden. Fehler

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)} 

Allerdings erhalte ich der folgende Fehler: "Kotlin: Operator '==' kann nicht auf 'kotlin.Int' und 'Person?' angewendet werden." Wie kann ich den Code reparieren, damit er funktioniert?

Antwort

5

Kotlins maxBy Funktion (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/max-by.html) gibt T? für eine iterierbare von T (wie eine Liste von T).

Daher gibt people.maxBy(Person::age) einen Wert vom Typ Person? zurück, aber Sie versuchen, es mit einer Ganzzahl zu vergleichen. Sie können das Alter dieses Person? vergleichen, wenn Sie wollen:

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

Will Ausgang [Person(name=Bob, age=31)] für Ihre Probe.

9

Verwenden Sie map + max anstelle von maxBy. Auch extrahieren den Maximalwert einer Variablen zu vermeiden, ist es mehrmals Berechnung:

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 } 
0

Ich würde so etwas tun:

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

Also, warum meine Lösung, die funktioniert Downvoted wird? Es gibt eine Liste von Personen mit dem maximalen Alter zurück. Andere Lösungen sind ineffizienter, da sie das Maximum für jeden Vergleich berechnen müssen. – jorgemf

Verwandte Themen