给定java枚举类,按值查找枚举

问题描述 投票:0回答:1

我的项目中的一个共同愿望是在给定其构造值之一时找到一个枚举。例如:

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
对象访问。

java generics enums
1个回答
0
投票

看来部分困难在于作为每个 Enum 类一部分的静态方法 value() 无法通过 Class 对象访问。

这不是问题:您可以使用

EnumSet.allOf(Class)
访问给定枚举
Class
的所有枚举值。然后您可以像普通的
Set
一样使用它,包括通过它进行流式传输。

© www.soinside.com 2019 - 2024. All rights reserved.