Java Language Utilizzo delle espressioni Lambda per ordinare una raccolta

Esempio

Liste di ordinamento

Prima di Java 8, era necessario implementare l'interfaccia java.util.Comparator con una classe anonima (o named) durante l'ordinamento di una lista 1 :

Java SE 1.2
List<Person> people = ...
Collections.sort(
    people,
    new Comparator<Person>() {
        public int compare(Person p1, Person p2){
            return p1.getFirstName().compareTo(p2.getFirstName());
        }
    }
);

A partire da Java 8, la classe anonima può essere sostituita con un'espressione lambda. Si noti che i tipi per i parametri p1 e p2 possono essere omessi, in quanto il compilatore li dedurrà automaticamente:

Collections.sort(
    people, 
    (p1, p2) -> p1.getFirstName().compareTo(p2.getFirstName())
);

L'esempio può essere semplificato utilizzando Comparator.comparing e i riferimenti ai metodi espressi utilizzando il simbolo :: (doppio punto).

Collections.sort(
    people,
    Comparator.comparing(Person::getFirstName)
);

Un'importazione statica ci consente di esprimerlo in modo più conciso, ma è discutibile se questo migliora la leggibilità complessiva:

import static java.util.Collections.sort;
import static java.util.Comparator.comparing;
//...
sort(people, comparing(Person::getFirstName));

I comparatori costruiti in questo modo possono anche essere concatenati insieme. Ad esempio, dopo aver confrontato le persone con il loro nome, se ci sono persone con lo stesso nome, il metodo thenComparing con anche il confronto per cognome:

sort(people, comparing(Person::getFirstName).thenComparing(Person::getLastName));

1 - Si noti che Collections.sort (...) funziona solo su raccolte che sono sottotipi di List . Le API Set e Collection non implicano alcun ordine degli elementi.

Ordinare le mappe

È possibile ordinare le voci di una HashMap base al valore in modo simile. (Si noti che una LinkedHashMap deve essere utilizzata come destinazione. Le chiavi in ​​una HashMap ordinaria non sono ordinate.)

Map<String, Integer> map = new HashMap();  // ... or any other Map class
// populate the map
map = map.entrySet()
    .stream()
    .sorted(Map.Entry.<String, Integer>comparingByValue())
    .collect(Collectors.toMap(k -> k.getKey(), v -> v.getValue(),
                              (k, v) -> k, LinkedHashMap::new));