java查询枚举_使用Java 8 Stream API查找枚举值

小编典典

我会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 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,但是如何整齐地填充它呢?枚举不允许您在初始化枚举实例之前初始化静态字段,但是有一个巧妙的小技巧,称为“ 按需初始化holder idiom”,它使使用此功能所需的静态初始化映射变得容易实现:

public enum Code {

CODE_1("string1"),

CODE_2("string2"),

CODE_3("string3"),

// etc

;

private static class Holder {

static Map CODE_MAP = new HashMap<>();

}

private final String code;

private Code(String code) {

this.code = code;

Holder.CODE_MAP.put(code, this);

}

public String getCode() {

return this.code;

}

public Code convertFromString(String code) {

return CODE_MAP.get(code);

}

}

之所以可行,是因为类加载器在初始化枚举类之前先初始化内部静态类,因此将映射分配为在枚举实例初始化期间准备加载。

没有循环。无需特殊代码即可加载地图(在构造函数中完成)。最少的代码。

希望能帮助到你 !:)

2020-09-11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值