Tâche:
Vous avez une liste people
d'objets de classe Person
qui a des champs name
et 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]#sortBy
méthode accepte une fonction A => B
où il B
est nécessaire d' avoir un Ordering
. Ordering
est 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 comparing
et 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 sortBy
dans 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 comparing
n'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. :)