Compito:
Hai un elenco peopledi oggetti della classe Personche ha campi namee age. Il tuo compito è ordinare questo elenco prima per namee poi per age.
Java 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))
Aggiornare
Da quando ho scritto questa risposta, ci sono stati dei progressi. I lambda (e i riferimenti ai metodi) sono finalmente atterrati in Java e stanno conquistando il mondo di Java.
Ecco come apparirà il codice sopra con Java 8 (contributo di @fredoverflow):
people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
Sebbene questo codice sia quasi altrettanto breve, non funziona in modo così elegante come quello Scala.
Nella soluzione Scala, il Seq[A]#sortBymetodo accetta una funzione in A => Bcui Bè richiesto di avere un'estensione Ordering. Orderingè una classe di tipo. Pensa meglio di entrambi i mondi: come Comparable, è implicito per il tipo in questione, ma come Comparator, è estensibile e può essere aggiunto in modo retrospettivo ai tipi che non lo avevano. Poiché Java manca di classi di tipo, deve duplicare ogni metodo di questo tipo, una volta per Comparable, poi per Comparator. Ad esempio, vedi comparinge thenComparing qui .
Le classi di tipo consentono di scrivere regole come "Se A ha un ordine e B ha un ordine, anche la loro tupla (A, B) ha un ordine". Nel codice, ovvero:
implicit def pairOrdering[A : Ordering, B : Ordering]: Ordering[(A, B)] = // impl
È così che sortBynel nostro codice si possono confrontare per nome e poi per età. Quelle semantiche saranno codificate con la "regola" di cui sopra. Un programmatore Scala si aspetterebbe intuitivamente che funzioni in questo modo. Non è comparingstato necessario aggiungere metodi per scopi speciali come Ordering.
Lambda e riferimenti ai metodi sono solo la punta di un iceberg che è la programmazione funzionale. :)