Tâche:
Vous avez une liste peopled'objets de classe Personqui a des champs nameet age. Votre tâche consiste à trier cette liste d'abord par name, puis par 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))
Mettre à jour
Depuis que j'ai écrit cette réponse, il y a eu pas mal de progrès. Les lambdas (et les références de méthodes) ont enfin atterri à Java et prennent d'assaut le monde Java.
Voici à quoi ressemblera le code ci-dessus avec Java 8 (contribué par @fredoverflow):
people.sort(Comparator.comparing(Person::getName).thenComparing(Person::getAge));
Bien que ce code soit presque aussi court, il ne fonctionne pas aussi élégamment que celui de Scala.
Dans la solution Scala, la Seq[A]#sortByméthode accepte une fonction A => Boù il Best nécessaire d' avoir un Ordering. Orderingest une classe de type. Pensez au mieux aux deux mondes: comme Comparable, c'est implicite pour le type en question, mais comme Comparator, c'est extensible et peut être ajouté rétrospectivement aux types qui ne l'avaient pas. Comme Java manque de classes de types, il doit dupliquer chacune de ces méthodes, une fois pour Comparable, puis pour Comparator. Par exemple, voir comparinget thenComparing ici .
Les classes de type permettent d'écrire des règles telles que "Si A a un ordre et B un ordre, alors leur tuple (A, B) a également un ordre". Dans le code, c'est-à-dire:
implicit def pairOrdering[A : Ordering, B : Ordering]: Ordering[(A, B)] = // impl
C'est ainsi que le sortBydans notre code peut comparer par nom puis par âge. Cette sémantique sera encodée avec la "règle" ci-dessus. Un programmeur Scala s'attendrait intuitivement à ce que cela fonctionne de cette façon. Aucune méthode spéciale comme celle-ci comparingn'a dû être ajoutée Ordering.
Les lambdas et les références de méthodes ne sont que la pointe d'un iceberg qui est la programmation fonctionnelle. :)