Tugas:
Anda memiliki daftar people
objek kelas Person
yang memiliki bidang name
dan 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]#sortBy
metode menerima fungsi A => B
di mana B
diperlukan untuk memiliki sebuah Ordering
. Ordering
adalah 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 comparing
dan 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 sortBy
dalam 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 comparing
harus ditambahkan Ordering
.
Lambda dan referensi metode hanyalah puncak gunung es yang merupakan pemrograman fungsional. :)