java - 字符串与 Java 枚举的不区分大小写匹配

标签 java generics enums

Java提供valueOf()每个 Enum<T> 的方法对象,因此给出 enum喜欢

public enum Day {
  Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

可以进行类似的查找

Day day = Day.valueOf("Monday");

如果字符串传递给 valueOf()与现有的 Day 不匹配(区分大小写)值,IllegalArgumentException被抛出。

要进行不区分大小写的匹配,可以在 Day 中编写自定义方法。枚举,例如

public static Day lookup(String day) {
  for (Day d : Day.values()) {
    if (d.name().equalsIgnoreCase(day)) {
      return type;
    }
  }
  return null;
}

是否有任何通用方法,不使用缓存值或任何其他额外对象,来编写静态 lookup()像上面这样的方法只有一次(即,不是每个 enum ),因为 values()方法被隐式添加到 Enum<E>编译时的类?

这种“通用”的签名lookup()方法类似于 Enum.valueOf()方法,即:

public static <T extends Enum<T>> T lookup(Class<T> enumType, String name);

它将完全实现 Day.lookup() 的功能任何 enum 的方法,无需为每个 enum 重新编写相同的方法.

最佳答案

我发现获得特殊的泛型混合有点棘手,但这是可行的。

public static <T extends Enum<?>> T searchEnum(Class<T> enumeration,
        String search) {
    for (T each : enumeration.getEnumConstants()) {
        if (each.name().compareToIgnoreCase(search) == 0) {
            return each;
        }
    }
    return null;
}

例子

public enum Horse {
    THREE_LEG_JOE, GLUE_FACTORY
};

public static void main(String[] args) {
    System.out.println(searchEnum(Horse.class, "Three_Leg_Joe"));
    System.out.println(searchEnum(Day.class, "ThUrSdAy"));
}

关于java - 字符串与 Java 枚举的不区分大小写匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332924/

相关文章:

java - Elasticsearch:如何使产品名称在搜索中比产品描述更重要?

c# - 隐式输出参数

.net - 如何在 Linq to Entities 查询中使用标志枚举?

android - 让 Android 枚举描述出现在 JavaDoc 中

java - 模拟静态类

java - 在Java中如何检查一个对象是否在链表中?

java - 当代码复制到另一个项目时,Eclipse 提示名称冲突

java - 您可以像在 .NET 中那样在 Java 中创建未定义的枚举值吗?

java - MongoDB Java 拉取

java - 通用 OR 而不是 AND <T extends Number |字符序列>