Java 8 Stream in Map umwandeln

In die folgende Situation ist schon fast jeder Entwickler einmal gekommen: man hat eine Liste von Objekten mit IDs und möchte eine Map erstellen um schnell mit einer ID auf das richtige Objekt zuzugreifen.

Als Beispiel dient hier wie so oft die Klasse Person mit ID, Vorname und Nachname:

public class Person {
    private String id;
    private String firstName;
    private String lastName;

    public Person(String id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }
    … Getter, toString, etc. ….
}

Wenn man eine Liste von Objekten weiterverarbeiten will, bietet sich ab Java 8 das Stream API an. Um die Elemente eines Streams wieder in eine Collection "einzusammeln" gibt es die Methode collect(). Diese nimmt einen Collector entgegen. Die statische Util-Klasse java.util.stream.Collectors bietet eine Auswahl an verschiedenen Standard-Kollektoren an.

Im folgenden Beispiel wird zuerst eine Liste von Personen erstellt. In vielen Fällen wird so eine Liste wohl aus einer Datenbank kommen.

List<Person> persons = new ArrayList<>();
persons.add(new Person("1", "Isaac", "Newton"));
persons.add(new Person("2", "Albert", "Einstein"));
persons.add(new Person("3", "Nicola", "Tesla"));

Map<String, Person> personMap = persons
        .stream()
        .collect(Collectors.toMap(p -> p.getId(), p -> p));

System.out.println(personMap.get("2"));
// Ausgabe: [2, Albert, Einstein]

Aus der Liste kann direkt ein Stream erstellt und dieser sofort wieder mit collect() weiterverarbeitet werden. Die Factorymethode Collectors.toMap() hat zwei Argumente: eine Funktion, die den Key zurückgibt und eine Funktion für den zugehörigen Wert. In unserem Fall möchten wir als Key die ID der Person, die wir durch den Lambdaausdruck p -> p.getId() erhalten. Als zugehörigen Wert möchten wir die Person selbst, also p -> p.

Das Ergebnis ist eine Map die als Keys die IDs und als Werte die entsprechenden Objekte enthält.


Ähnliche Artikel