Collectors.toMap renvoie généralement une instance de la classe Map.
Collectors.Exemple toMap
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()
));
Si vous souhaitez renvoyer une classe enfant de la classe Map, telle que HashMap, LinkedHashMap, TreeMap, vous pouvez utiliser Collectors.toMap avec quatre arguments.
Collectors.toMap
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
Collectors.Exemple de retour de HashMap avec toMap
HashMap<ENUM, Integer> map= Stream.of(ENUM.values())
.collect(Collectors.toMap(
e -> e
,e -> e.ordinal()
,(e1, e2) -> e1
,HashMap::new
));
Si vous souhaitez que Collectors.toMap renvoie EnumMap, EnumMap n'a pas de constructeur sans argument. Dans ce cas, comment l'implémenter est OK si vous l'implémentez avec une expression lambda car il est impossible de faire référence au constructeur.
Collectors.Exemple 1 qui renvoie EnumMap avec toMap
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;
}
));
Si vous omettez diverses choses, vous pouvez également écrire comme suit.
Collectors.Exemple 2 renvoyant EnumMap avec toMap
EnumMap<ENUM, Integer> map = Stream.of(ENUM.values())
.collect(Collectors.toMap(
e -> e
,e -> e.ordinal()
,(e1, e2) -> e1
,() -> new EnumMap<>(ENUM.class)
));