java - 按值获取枚举常量

标签 java enums

我想创建一个方法,它通过它的值返回枚举常量。
我有多个枚举类,看起来像这样(其中一些具有不同名称的 getter 变量):

@AllArgsConstructor
public enum PhoneType {

MOBILE("Mobile", 3),
HOME("Home", 6),
WORK("Work", 7);

@Getter
String type;

@Getter
int id;
}
我使用这个流来获取枚举常量:
int phoneTypeId = 3;

PhoneType phoneType = Arrays.stream(PhoneType.values())
   .filter(p -> p.getId() == phoneTypeId)
   .findFirst()
   .orElseThrow(() -> new RuntimeException("Not able to find Enum...."));

System.out.println(phoneType.getType());
输出是:“手机”
现在我想创建一个适用于不同枚举类的方法。我从这样的事情开始,但我不知道如何重写过滤器行,使其适用于任何枚举类。最好将此“p -> p.getId() == phoneTypeId”作为输入参数传递给此方法。有任何想法吗?
public static <E extends Enum<?>> E getEnumByValue(Class<E> enumClass) {
    return Arrays.stream(enumClass.getEnumConstants())
            .filter(p -> p.getId() == phoneTypeId)
            .findFirst()
            .orElseThrow(() -> new RuntimeException("Not able to find Enum...."));
}
(我知道如果我为所有枚举类实现接口(interface),则可以这样做,但是枚举变量必须具有相同的名称。)

最佳答案

您可以将其作为 Predicate 传递:

public static <E extends Enum<?>> Optional<E> getEnumByValue(Class<E> enumClass, Predicate<E> predicate) {
    return Arrays.stream(enumClass.getEnumConstants())
            .filter(predicate)
            .findFirst();
}
(注意:该方法实际上应该返回一个 Optional<E> )
如果所有枚举都有 id,你仍然可以实现一个通用接口(interface):
interface Identifiable {
    int getId();
}

enum PhoneType implements Identifiable {
    ...
}

public static <E extends Enum<?> & Identifiable> Optional<E> getEnumById(Class<E> enumClass, int id) {
    return Arrays.stream(enumClass.getEnumConstants())
            .filter(e -> e.getId() == id)
            .findFirst();
}

Optional<PhoneType> phone = getEnumById(PhoneType.class, phoneTypeId);

关于java - 按值获取枚举常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66260482/

相关文章:

java - 将属性文件添加到 Maven 构建过程

java - 理解java swing的困难

java - 无法在 Spock 中断言值

java - 用字符串列表构造一棵树并计数

swift - Switch 语句循环 Swift 中的所有情况

java - 获取图像模糊的百分比

c# 枚举函数参数

java - 在运行时创建和覆盖 Java 枚举对象 [GregTech/minecraft]

angularjs - AngularJS 中枚举的最佳解决方案?

nhibernate - Hibernate/NHibernate 中的枚举表