1063 Stimmen

Java 8 List<V> in Map<K, V> umwandeln

Ich möchte eine Liste von Objekten in eine Map mit Java 8 Streams und Lambdas übersetzen.

So würde ich es in Java 7 und darunter schreiben.

private Map nameMap(List choices) {
        final Map hashMap = new HashMap<>();
        for (final Choice choice : choices) {
            hashMap.put(choice.getName(), choice);
        }
        return hashMap;
}

Das kann ich einfach mit Java 8 und Guava erreichen, aber ich möchte wissen, wie man dies ohne Guava machen kann.

In Guava:

private Map nameMap(List choices) {
    return Maps.uniqueIndex(choices, new Function() {

        @Override
        public String apply(final Choice input) {
            return input.getName();
        }
    });
}

Und Guava mit Java 8 Lambdas.

private Map nameMap(List choices) {
    return Maps.uniqueIndex(choices, Choice::getName);
}

1528voto

zapl Punkte 61619

Basierend auf der Collectors Dokumentation ist es so einfach wie:

Map result =
    choices.stream().collect(Collectors.toMap(Choice::getName,
                                              Function.identity()));

372voto

Ulises Punkte 8815

Wenn Ihr Schlüssel NICHT garantiert eindeutig für alle Elemente in der Liste ist, sollten Sie ihn stattdessen in eine Map> anstatt in eine Map umwandeln

Map> result =
 choices.stream().collect(Collectors.groupingBy(Choice::getName));

183voto

Ole Punkte 34941

Verwenden Sie getName() als Schlüssel und Choice selbst als Wert der Map:

Map result =
    choices.stream().collect(Collectors.toMap(Choice::getName, c -> c));

39voto

Sahil Chhabra Punkte 9561

Die meisten der aufgeführten Antworten übersehen einen Fall, wenn die Liste doppelte Elemente enthält. In diesem Fall wirft ihre Antwort IllegalStateException. Sehen Sie sich den folgenden Code an, um auch Listenduplikate zu behandeln:

public Map convertListToMap(List choices) {
    return choices.stream()
        .collect(Collectors.toMap(Choice::getName, choice -> choice,
            (oldValue, newValue) -> newValue));
  }

32voto

Emre Colak Punkte 814

Hier ist noch eine, falls du Collectors.toMap() nicht verwenden möchtest

Map result =
   choices.stream().collect(HashMap::new, 
                           (m, c) -> m.put(c.getName(), c),
                           (m, u) -> {});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X