Collectors.toMap gibt normalerweise eine Instanz der Map-Klasse zurück.
Collectors.toMap Beispiel
enum ENUM {
ENUM_1
,ENUM_2
,ENUM_3
,ENUM_4
,ENUM_5
,ENUM_6
}
Map<ENUM, Integer> map = Stream.of(ENUM.values())
.collect(Collectors.toMap(
e -> e
,e -> e.ordinal()
));
Wenn Sie eine untergeordnete Klasse der Map-Klasse wie HashMap, LinkedHashMap oder TreeMap zurückgeben möchten, können Sie Collectors.toMap mit vier Argumenten verwenden.
Collectors.toMap
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
Collectors.Beispiel für die Rückgabe von HashMap mit toMap
HashMap<ENUM, Integer> map= Stream.of(ENUM.values())
.collect(Collectors.toMap(
e -> e
,e -> e.ordinal()
,(e1, e2) -> e1
,HashMap::new
));
Wenn Collectors.toMap EnumMap zurückgeben soll, verfügt EnumMap nicht über einen argumentlosen Konstruktor. In diesem Fall ist die Implementierung in Ordnung, wenn Sie sie mit einem Lambda-Ausdruck implementieren, da nicht auf den Konstruktor verwiesen werden kann.
Collectors.Beispiel 1, das EnumMap mit toMap zurückgibt
EnumMap<ENUM, Integer> map = Stream.of(ENUM.values())
.collect(Collectors.toMap(
e -> e
,e -> e.ordinal()
,(e1, e2) -> e1
,() -> {
EnumMap<ENUM, Integer> ret = new EnumMap<>(ENUM.class);
return ret;
}
));
Wenn Sie verschiedene Dinge weglassen, können Sie auch wie folgt schreiben.
Collectors.Beispiel 2 Rückgabe von EnumMap mit toMap
EnumMap<ENUM, Integer> map = Stream.of(ENUM.values())
.collect(Collectors.toMap(
e -> e
,e -> e.ordinal()
,(e1, e2) -> e1
,() -> new EnumMap<>(ENUM.class)
));