Aquí es lo que hago para llenar mi mapa estático
public static final Map<String, FooBar> mapEnum =
Arrays.stream(FooBarEnum.values())
.collect(Collectors.toMap(e-> StringUtils.upperCase(e.name), e -> e));
Quiero añadir otro single clave-valor a este mapa.
mapEnum.put("xx", FooBar.A);
Aquí está la enumeración
public enum FooBar {
A("a"), B("b"), C("c");
}
Mi mapa estático se parecerá a esto después de un mapa se construye
{"a":FooBar.A, "b": FooBar.B, "c": FooBar.C, "xx": Foobar.A}
¿Es posible incluir la llamada explícita puesta en Collectors.toMap()
?
En realidad no veo la necesidad de utilizar corrientes de Java para eso. Sólo tiene que utilizar el static
bloque para inicializar mapEnum
y put
valores adicionales en el mismo:
public static final Map<String, FooBar> mapEnum;
static {
mapEnum = Arrays.stream(FooBar.values())
.collect(Collectors.toMap(FooBar::getName, Function.identity()));
mapEnum.put("xx", FooBar.A);
// ...
}
Collectors.toMap()
: No hay garantías en cuanto al tipo, la mutabilidad, serializabilidad, o hilos de seguridad de la {} @code Mapa devuelto.
Para garantizar la mutabilidad de la Map
que devuelve Collectors.toMap()
, lo que puede utilizar Map.put()
posteriormente utilizar mejor esta:
Arrays.stream(FooBar.values())
.collect(Collectors.toMap(Function.identity(), Function.identity(), (a, b) -> a, HashMap::new));
Si realmente quiere usar Java arroyos puede utilizar esto:
public static final Map<String, FooBar> mapEnum = Stream.concat(
Stream.of(FooBar.values()).map(e -> Map.entry(e.getName(), e)),
Stream.of(Map.entry("xx", FooBar.A))
).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
O si también desea agregar todos los nombres al valor de enumeración en sí puede cambiar su clase como esta:
public static enum FooBar {
A("a", "xx"), B("b"), C("c");
private String[] names;
FooBar(String... names) {
this.names = names;
}
public String[] getNames() {
return names;
}
}
Y utilizar esto para crear el mapa:
public static final Map<String, FooBar> mapEnum = Stream.of(FooBar.values())
.flatMap(e -> Arrays.stream(e.getNames()).map(n -> Map.entry(n, e)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Antes de Java 9 utilizan new AbstractMap.SimpleEntry<>()
en lugar de Map.entry()
. Si necesita el mapa para ser uso ordenada LinkedHashMap::new
con Collectors.toMap()
.