Сортировка коллекции по нескольким полям в Котлине

Предположим, у меня есть список людей, которые мне нужно отсортировать по возрасту сначала, а затем по имени.

Исходя из C # -background, я легко могу добиться этого на указанном языке, используя 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(); 

Как это сделать с помощью Kotlin?

Это то, что я пробовал (это явно неправильно, так как вывод первого предложения sortedBy становится переопределенным вторым, что приводит к списку, отсортированному только по имени)

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

Solutions Collecting From Web of "Сортировка коллекции по нескольким полям в Котлине"

sortedWith + compareBy (с использованием vararg lambdas) делают трюк:

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

Вы также можете использовать несколько более сжатый ссылочный синтаксис:

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

Используйте sortedWith для сортировки списка с помощью Comparator .

Затем вы можете построить компаратор несколькими способами:

  • compareBy , thenBy построить компаратор в цепочке вызовов:

     list.sortedWith(compareBy<Person> { it.age }.thenBy { it.name }.thenBy { it.address }) 
  • compareBy имеет перегрузку, которая выполняет несколько функций:

     list.sortedWith(compareBy({ it.age }, { it.name }, { it.address }))