假设我有一个人的列表,我需要先按年龄排序,然后按名字排序。

来自c#背景,我可以通过使用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

当前回答

sortedWith + compareBy(取lambdas的可变参数):

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

你也可以使用更简洁的可调用引用语法:

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

其他回答

使用sortedWith使用Comparator对列表进行排序。

然后你可以使用以下几种方法来构造一个比较器:

compareBy,然后by在调用链中构造比较器: 列表。sortedWith(compareBy<Person>{它。年龄}。然后通过{it.name}。然后通过{它。地址}) compareBy有一个重载,它接受多个函数: 列表。sortedWith (compareBy({它。年龄},{it.name}, {it.name。地址}))

sortedWith + compareBy(取lambdas的可变参数):

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

你也可以使用更简洁的可调用引用语法:

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