我会
findFirst改用:
return Arrays.stream(Type.values()) .filter(e -> e.s.equals(val)) .findFirst() .orElseThrow(() -> new IllegalStateException(String.format("Unsupported type %s.", val)));尽管
Map在这种情况下a 可能更好:
enum Type{ X("S1"), Y("S2"); private static class Holder { static Map<String, Type> MAP = new HashMap<>(); } private Type(String s) { Holder.MAP.put(s, this); } public static Type find(String val) { Type t = Holder.MAP.get(val); if(t == null) { throw new IllegalStateException(String.format("Unsupported type %s.", val)); } return t; }}我从这个答案中学到了这个技巧。基本上,类加载器会在枚举类之前初始化静态类,这使您可以
Map将枚举构造器本身填充。非常便利
!
您想要一个
Map<String, Code>,但是如何整齐地填充它呢?枚举不允许您在初始化枚举实例之前初始化静态字段,但是有一个巧妙的小技巧,称为“ 按需初始化holder idiom”,它使使用此功能所需的静态初始化映射变得容易实现:
public enum Code { CODE_1("string1"), CODE_2("string2"), CODE_3("string3"), // etc ; private static class Holder { static Map<String, Code> CODE_MAP = new HashMap<>(); } private final String pre; private Code(String pre) { this.pre = pre; Holder.CODE_MAP.put(pre, this); } public String getCode() { return this.pre; } public Code convertFromString(String pre) { return CODE_MAP.get(pre); }}之所以可行,是因为类加载器在初始化枚举类之前先初始化内部静态类,因此将映射分配为在枚举实例初始化期间准备加载。
没有循环。无需特殊代码即可加载地图(在构造函数中完成)。最少的代码。
希望能帮助到你 !:)



