На самом деле я не вижу необходимости использовать Java Streams для этого. Вы можете просто использовать блок static
для инициализации mapEnum
и put
дополнительных значений в нем:
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()
: Нет никаких гарантий относительно типа, изменчивости, сериализуемости или поточной безопасности возвращаемого {@code Map}.
Чтобы обеспечить изменчивость Map
, возвращаемого Collectors.toMap()
, чтобы вы могли использовать Map.put()
, впоследствии лучше использовать это:
Arrays.stream(FooBar.values())
.collect(Collectors.toMap(Function.identity(), Function.identity(), (a, b) -> a, HashMap::new));
Если вы действительно хотите использовать потоки Java, вы можете использовать это:
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));
Или, если вы также хотите добавить все имена в само значение enum, вы можете изменить свой класс следующим образом:
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;
}
}
И используйте это для создания карты:
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));
До Java 9 использовать new AbstractMap.SimpleEntry<>()
вместо Map.entry()
. Если вам нужно отсортировать карту, используйте LinkedHashMap::new
с Collectors.toMap()
.