我的项目中的一个共同愿望是在给定其构造值之一时找到一个枚举。例如:
public enum Animal {
DOG("bark"),
CAT("meow");
public final String sound;
Animal(String sound) {
this.sound = sound;
}
public String getSound() {
return sound;
}
}
如果给定字符串
"meow"
,我想得到一个CAT
简单的解决方案是编写一个迭代 Enum 值的搜索方法
public static Animal getBySound(String sound) {
for(Animal e : values()){
if(e.sound == sound){
return e;
}
}
}
但这必须针对每个定义的枚举单独完成。 有没有一种方法,给定一个 Enum 类和一个获取字段值的方法,你可以获取指定字段与输入匹配的枚举?
可能的签名:
public static <T extends Enum<T>, V> Optional<T> findEnumByValue(Class<T> enumClass, Function<T, V> fieldGetter, V valueToMatch)
我得到的最接近的是这个,但是第一个参数是
Enum[]
距离完全类型安全仅一步之遥(因为可以为该方法提供任意枚举数组)
public static <T extends Enum<T>, V> Optional<T> findEnumByValue(T[] enums, Function<T, V> fieldGetter, V valueMatch) {
return Arrays.stream(enums).filter(element -> Objects.equals(fieldGetter.apply(element), valueMatch)).findFirst();
}
// Example usage
Animal animal = findEnumByValue(Animal.values(), Animal::getSound, "meow").orElse(CAT);
看来部分困难在于作为每个 Enum 类一部分的静态方法
values()
无法通过 Class
对象访问。
看来部分困难在于作为每个 Enum 类一部分的静态方法 value() 无法通过 Class 对象访问。
这不是问题:您可以使用
EnumSet.allOf(Class)
访问给定枚举 Class
的所有枚举值。然后您可以像普通的 Set
一样使用它,包括通过它进行流式传输。