「C# でこんなの書けるけど Kotlin ではどう書くの?」 という話。
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();
Javaのコードから考えるとKotlinでももちろんシンプルな記述となります。
val sortedList = list
.sortedWith(compareBy({ it.age }, { it.name }))
val sortedList = list
.sortedWith(compareBy(Person::age, Person::name))
list.sortedWith(compareBy<Person> { it.age }.thenBy { it.name }.thenBy { it.address })
list.sortedWith(compareBy({ it.age }, { it.name }, { it.address }))
java - Sort collection by multiple fields in Kotlin - Stack Overflow
大文字小文字を無視する場合。
places
.sortedWith(
compareBy(String.CASE_INSENSITIVE_ORDER, { it.name })
)
places
.sortedWith(
compareBy(String.CASE_INSENSITIVE_ORDER) { it.name }
)
places
.sortedWith(
compareBy(String.CASE_INSENSITIVE_ORDER, Place::name)
)
kotlin - How to sort objects list in case insensitive order? - Stack Overflow
降順昇順の対応やモデルに入れたり。
val sortedList = list
.sortedWith(compareBy({ it.a }, { it.b }, { it.c }))
list.sortedWith(
compareBy<Foo> { it.a }
.thenByDescending { it.b }
.thenBy { it.c }
)
class Foo(val a: String, val b: Int, val c: Date) : Comparable<Foo> {
override fun compareTo(other: Foo)
= compareValuesBy(this, other, { it.a }, { it.b }, { it.c })
}
val sortedList = list.sorted()
class Foo(val a: String, val b: Int, val c: Date) : Comparable<Foo> {
override fun compareTo(other: Foo) = comparator.compare(this, other)
companion object {
val comparator = compareBy(Foo::a, Foo::b, Foo::c)
}
}
val sortedList = list.sorted()
comparable - How to sort based on/compare multiple values in Kotlin? - Stack Overflow
シンプルで便利になりつつも複数の記述で書くことができてしまう最近の言語のパターン。