Ordenar colección por múltiples campos en Kotlin

Digamos que tengo una list de personas que debo orderar primero por Edad y luego por Nombre.

Viniendo de un background de C #, puedo lograrlo fácilmente en dicho lenguaje usando LINQ:

var list=new List<Person>(); list.Add(new Person(25, "Tom")); list.Add(new Person(25, "Dave")); list.Add(new Person(20, "Kate")); list.Add(new Person(20, "Alice")); //will produce: Alice, Kate, Dave, Tom var sortedList=list.OrderBy(person => person.Age).ThenBy(person => person.Name).ToList(); 

¿Cómo se logra esto usando Kotlin?

Esto es lo que probé (obviamente está mal, ya que el resultado de la primera cláusula "sortedBy" queda anulado por el segundo, lo que da como resultado una list orderada por Name solamente)

 val sortedList = ArrayList(list.sortedBy { it.age }.sortedBy { it.name })) //wrong 

sortedWith + compareBy (tomando un vararg de lambdas) haz el truco:

 val sortedList = list.sortedWith(compareBy({ it.age }, { it.name })) 

También puede usar la syntax de reference invocable algo más sucinta:

 val sortedList = list.sortedWith(compareBy(Person::age, Person::name)) 

Use sortedWith para orderar una list con Comparator .

Luego puede build un comparador usando varias forms:

  • compareBy , construya el comparador en una cadena de llamadas:

     list.sortedWith(compareBy<Person> { it.age }.thenBy { it.name }.thenBy { it.address }) 
  • compareBy tiene una sobrecarga que requiere múltiples funciones:

     list.sortedWith(compareBy({ it.age }, { it.name }, { it.address })) 
  • Convierte java en kotlin en pasta
  • La propiedad de Android Kotlin Protected expone su tipo privado ExpiresLayout
  • Cómo crear una notificación activada por time que funciona en todos los dispositivos Android
  • Nueva architecture con Dagger y Kotlin
  • Los colors de Android Material Design no se aplican de forma coherente
  • Clase abstracta Kotlin java IllegalAccessError
  • socket de server que escucha en el cliente frente al service de votación para la aplicación de postría instantánea de Android
  • Crear un observable común que evite múltiples llamadas
  • Kotlin: ¿cómo devolver algún valor del scope?
  • Crea una rueda giratoria que networkingimensiona su ancho cuando se selecciona un elemento
  • No se puede usar getter personalizado con propiedad delegada