在我的项目中,一个共同的愿望是在给定其构造值之一的情况下找到一个枚举.例如:

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.equals(sound)){
            return e;
        }
    }
}

但这必须单独完成,对于定义的每个枚举.Is there a way, given an Enum class and a method that gets a field's value, you can get the enum who's specified field matches the input?

可能的签名:

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);

似乎部分困难在于作 for each Enum类的一部分的静态方法values()不能通过Class对象访问.

推荐答案

看起来部分困难在于作 for each Enum类一部分的静态方法Values()不能通过Class对象访问.

这不是问题:您可以使用EnumSet.allOf(Class)来访问给定枚举Class的所有枚举值.然后你可以像使用普通的Set一样使用它,包括在它上面进行流媒体播放.

Optional<Animal> anAnimalThatMeows = 
    EnumSet
        .allOf(Animal.class)
        .stream()
        .filter(( Animal animal ) -> animal.getSound().equals("meow"))
        .findAny() ;

看这code run at Ideone.com

Java相关问答推荐

无法运行Java(已解决)

如何使用解析器组合子解析Java数组类型签名?

在现代操作系统/硬件上按块访问数据值得吗?

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

多个Java线程和TreeMap.put()的非预期行为

Java记录的不同序列化/反序列化

Java中的死锁及其重入锁和锁

如何解释Java中for-each循环中对Iterable的强制转换方法引用?

格式中的特定回录键-值对

使用Jolt将字段转换为列表

在Eclipse中数组的可空性

允许同时执行两个方法,但不能同时执行这两个方法

无法播放音频:从资源加载库GStreamer-Lite失败

AbstractList保证溢出到其他方法

嘲笑黄瓜中的对象

视图被推出线性布局-Android

JavaFX,GridPane:在GridPane的列中生成元素将保持所有列的宽度

设置背景时缺少Android编辑文本下划线

转换为JSON字符串时,日期按天递减-Java

将在 Docker 中运行的 Spring Boot 连接到在 Docker 中运行的 PostgreSQL,无需 compose 文件?