实际上,我认为没有必要为此使用 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} 的类型、可变性、可序列化性或线程安全性。
为了保证Collectors.toMap()返回的Map的可变性,所以你以后可以使用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));
或者,如果您还想将所有名称添加到枚举值本身,您可以像这样更改您的类:
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()。