Tugas:
Anda memiliki daftar peopleobjek kelas Personyang memiliki bidang namedan age. Tugas Anda adalah mengurutkan daftar ini terlebih dahulu name, lalu menurutage .
Jawa 7:
Collections.sort(people, new Comparator<Person>() {
public int compare(Person a, Person b) {
return a.getName().compare(b.getName());
}
});
Collections.sort(people, new Comparator<Person>() {
public int compare(Person a, Person b) {
return Integer.valueOf(a.getAge()).compare(b.getAge());
}
});
Scala:
val sortedPeople = people.sortBy(p => (p.name, p.age))
Memperbarui
Sejak saya menulis jawaban ini, ada kemajuan yang cukup pesat. Lambda (dan referensi metode) akhirnya mendarat di Jawa, dan mereka menggemparkan dunia Jawa.
Seperti inilah kode di atas akan terlihat dengan Java 8 (disumbangkan oleh @fredoverflow):
people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
Meskipun kode ini hampir sama pendeknya, kode ini tidak berfungsi dengan elegan seperti kode Scala.
Dalam larutan Scala, yang Seq[A]#sortBymetode menerima fungsi A => Bdi mana Bdiperlukan untuk memiliki sebuah Ordering. Orderingadalah kelas tipe. Pikirkan yang terbaik dari kedua dunia: Seperti Comparable, ini tersirat untuk jenis yang dimaksud, tetapi seperti Comparator, ini dapat diperluas dan dapat ditambahkan secara retrospektif ke jenis yang tidak memilikinya. Karena Java tidak memiliki kelas tipe, ia harus menduplikasi setiap metode tersebut, sekali untuk Comparable, lalu untuk Comparator. Misalnya, lihat comparingdan di thenComparing sini .
Kelas-tipe memungkinkan seseorang untuk menulis aturan seperti "Jika A memiliki pengurutan dan B memiliki pengurutan, maka tupelnya (A, B) juga memiliki pengurutan". Dalam kode, yaitu:
implicit def pairOrdering[A : Ordering, B : Ordering]: Ordering[(A, B)] = // impl
Begitulah cara sortBydalam kode kita dapat dibandingkan berdasarkan nama dan kemudian berdasarkan usia. Semantik tersebut akan dikodekan dengan "aturan" di atas. Seorang programmer Scala secara intuitif akan mengharapkan ini bekerja dengan cara ini. Tidak ada metode tujuan khusus seperti yang comparingharus ditambahkan Ordering.
Lambda dan referensi metode hanyalah puncak gunung es yang merupakan pemrograman fungsional. :)