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

新手上路,请多包涵

Java 提供一个 valueOf() enum Enum<T>

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

并且它将完全实现 --- 任何 enum Day.lookup() 方法的功能,而不需要为每个 enum -cc-2b8 重写相同的方法

原文由 PNS 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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

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

原文由 Adam 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为最简单安全的方法是:

 Arrays.stream(Day.values())
    .filter(e -> e.name().equalsIgnoreCase(dayName)).findAny().orElse(null);

或者如果你想使用类对象,那么:

 Arrays.stream(enumClass.getEnumConstants())
    .filter(e -> (Enum)e.name().equalsIgnoreCase(dayName)).findAny().orElse(null);

原文由 sprinter 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题