[JAVA] Renvoie n'importe quelle classe Map dans Collectors.toMap

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)
		));

Recommended Posts

Renvoie n'importe quelle classe Map dans Collectors.toMap
NullpointException dans la classe d'injection
Écrire l'héritage de classe dans Ruby