如何从Java中的字符串值中获取枚举值

这篇具有很好参考价值的文章主要介绍了如何从Java中的字符串值中获取枚举值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问:

说我有一个枚举,它只是

public enum Blah {
    A, B, C, D
}

我想找到一个字符串的枚举值,例如 “A” 这将是 Blah.A。怎么可能做到这一点?

Enum.valueOf() 是我需要的方法吗?如果是这样,我将如何使用它?

答1:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

是的,Blah.valueOf(“A”) 会给您Blah.A。

请注意,名称必须是 exact 匹配,包括大小写:Blah.valueOf(“a”) 和 Blah.valueOf("A ") 都抛出 IllegalArgumentException。

静态方法 valueOf() 和 values() 在编译时创建,不会出现在源代码中。不过,它们确实出现在 Javadoc 中;例如,Dialog.ModalityType 显示了这两种方法。

作为参考,Blah.valueOf("A") 方法是区分大小写 并且不允许多余的空格,因此@JoséMi 在下面提出了替代解决方案。

@Michael Myers,由于这个答案是迄今为止投票最多的,我是否应该理解将枚举及其字符串值定义为完全相同的好习惯?

@KevinMeredith:如果您的意思是 toString() 值,不,我不会这么说。 name() 将为您提供枚举常量的实际定义名称,除非您覆盖它。

“在编译时创建并且不出现在源代码中”究竟是什么意思。 ?

@treesAreEverywhere 更具体地说,这些方法由编译器生成(或synthesized)。实际的 enum Blah {...} 定义不应尝试声明自己的 values 或 valuesOf。这就像您如何编写“AnyTypeName.class”,即使您从未真正声明过“类”成员变量;编译器使这一切都可以正常工作。 (此答案可能在 3 个月后对您不再有用,但以防万一。)

答2:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

如果文本与枚举值不同的另一种解决方案:

public enum Blah {
    A("text1"),
    B("text2"),
    C("text3"),
    D("text4");

    private String text;

    Blah(String text) {
        this.text = text;
    }

    public String getText() {
        return this.text;
    }

    public static Blah fromString(String text) {
        for (Blah b : Blah.values()) {
            if (b.text.equalsIgnoreCase(text)) {
                return b;
            }
        }
        return null;
    }
}

throw new IllegalArgumentException("No constant with text " + text + " found") 会比 return null 更好。

@Sangdol 通常检查 SUN - 哎呀 - Oracle 在相同情况下所做的事情是一件好事。正如 Enum.valueOf() 所展示的那样,IS 是在这种情况下抛出异常的最佳实践。 因为这是一种特殊情况。 “性能优化”是编写不可读代码的糟糕借口;-)

答3:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

使用来自 Joshua Bloch 的模式,Effective Java:

(为简洁而简化)

enum MyEnum {
    ENUM_1("A"),
    ENUM_2("B");

    private String name;

    private static final Map ENUM_MAP;

    MyEnum (String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    // Build an immutable map of String name to enum pairs.
    // Any Map impl can be used.

    static {
        Map map = new ConcurrentHashMap();
        for (MyEnum instance : MyEnum.values()) {
            map.put(instance.getName().toLowerCase(),instance);
        }
        ENUM_MAP = Collections.unmodifiableMap(map);
    }

    public static MyEnum get (String name) {
        return ENUM_MAP.get(name.toLowerCase());
    }
}

另见:

Oracle Java Example using Enum and Map of instances

Execution order of of static blocks in an Enum type

How can I lookup a Java enum from its String value

这在 Java 8 中甚至更简单,因为您可以这样做:Stream.of(MyEnum.values()).collect(toMap(Enum::name, identity()))我还建议覆盖 toString()(通过构造函数传入)并使用它而不是名称,特别是如果 Enum 与可序列化数据相关联,因为这可以让您控制套管没有给声纳一个合适的。

Static initialization is inherently synchronized,因此绝对没有理由在此处使用 ConcurrentHashMap,因为在初始化后地图永远不会被修改。因此,甚至例如 JLS 中的示例本身也使用常规 HashMap。

答4:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

这是我使用的一个漂亮的实用程序:

/**
 * A common method for all enums since they can't have another base class
 * @param  Enum type
 * @param c enum type. All enums must be all caps.
 * @param string case insensitive
 * @return corresponding enum, or null
 */
public static > T getEnumFromString(Class c, String string) {
    if( c != null && string != null ) {
        try {
            return Enum.valueOf(c, string.trim().toUpperCase());
        } catch(IllegalArgumentException ex) {
        }
    }
    return null;
}

然后在我的枚举类中,我通常有这个来节省一些打字:

public static MyEnum fromString(String name) {
    return getEnumFromString(MyEnum.class, name);
}

如果您的枚举不是全部大写,只需更改 Enum.valueOf 行。

太糟糕了,我不能将 T.class 用于 Enum.valueOf,因为 T 已被删除。

那个空的 catch 块真的让我发疯了,对不起。

@LazloBonin:异常是针对异常情况,而不是针对控制流。为自己获取一份 Effective Java。

可怕!始终,始终捕获可以处理的异常。上面的例子是一个如何不做的完美例子。为什么?所以它返回 NULL,然后调用者必须检查 NULL 或抛出 NPE。如果调用者知道如何处理这种情况,那么执行 if 与 try-catch 可能看起来更优雅,但如果他无法处理,他必须再次传递 null 并且调用者的调用者必须再次检查 NULL等等等等。

@whiskeysierra 我知道对 Java 或软件开发充满热情是一回事,但你得冷静一下。像这样出人头地/成为额外的人没有任何好处。

返回 Optional 而不是 nullable 怎么样?

答5:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

你也应该小心你的情况。让我解释一下:做 Blah.valueOf(“A”) 行,但 Blah.valueOf(“a”) 行不通。然后再次 Blah.valueOf(“a”.toUpperCase(Locale.ENGLISH)) 将工作。

在 Android 上,您应该使用 Locale.US,作为 sulai points out。

请注意默认语言环境!

答6:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

在 Java 8 或更高版本中,使用 Streams:

public enum Blah
{
    A("text1"),
    B("text2"),
    C("text3"),
    D("text4");

    private String text;

    Blah(String text) {
        this.text = text;
    }

    public String getText() {
        return this.text;
    }

    public static Optional fromText(String text) {
        return Arrays.stream(values())
          .filter(bl -> bl.text.equalsIgnoreCase(text))
          .findFirst();
    }
}

Java 8 做了一些好事,虽然我喜欢 Streams(主要用于并发)......这实际上不是使用它们的理由。它什么都不买 OP 并且性能更差......只需将所有项目的 for/next 循环替换为相同的 Stream 版本(甚至不是并行)。对于一些条目......谁在乎但要清楚,这不是一些“因为Java 8而更好”的例子。它只是返回 Optional vs null 的流利风格的绿色与蓝色“不同”实现(并且流利风格需要所有连接方法的非空返回)。

答7:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

这是一种可以对任何 Enum 执行此操作的方法,并且不区分大小写。

/** 
 * Finds the value of the given enumeration by name, case-insensitive. 
 * Throws an IllegalArgumentException if no match is found.  
 **/
public static > T valueOfIgnoreCase(
        Class enumeration, String name) {

    for (T enumValue : enumeration.getEnumConstants()) {
        if (enumValue.name().equalsIgnoreCase(name)) {
            return enumValue;
        }
    }

    throw new IllegalArgumentException(String.format(
        "There is no value with name '%s' in Enum %s",
        name, enumeration.getName()
    ));
}

很好地使用泛型,但不确定 IllegalArgumentException 是否真的是正确的合同。首先,查找失败完全有可能(并且预期?)......它本身不在集合中(实际上是枚举)。抛出 RuntimeException “在方法外传播 [s]”。由于这不在方法签名中 - 调用者不会期望它。最好使用 Map 构造(在未找到时返回 null)或者甚至更好... Optional.empty()。

答8:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

最好使用 Blah.valueOf(string),但您也可以使用 Enum.valueOf(Blah.class, string)。

答9:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

我的两分钱:使用 Java 8 Streams 并检查一个确切的字符串:

public enum MyEnum {
    VALUE_1("Super"),
    VALUE_2("Rainbow"),
    VALUE_3("Dash"),
    VALUE_3("Rocks");

    private final String value;

    MyEnum(String value) {
        this.value = value;
    }

    /**
     * @return the Enum representation for the given string.
     * @throws IllegalArgumentException if unknown string.
     */
    public static MyEnum fromString(String s) throws IllegalArgumentException {
        return Arrays.stream(MyEnum.values())
                .filter(v -> v.value.equals(s))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("unknown value: " + s));
    }
}

我将该函数重命名为 fromString(),因为使用该约定命名它,您将从 Java 语言本身获得一些好处;例如:

在 HeaderParam 注解处直接转换类型

答10:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

如果您不想编写自己的实用程序,请使用 Google 的 guava 库:

Enums.getIfPresent(Blah.class, "A")

与内置的 Java 函数不同,它让您检查 A 是否存在于 Blah 中并且不会引发异常。

答11:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

您可能需要这样做:

public enum ObjectType {
    PERSON("Person");

    public String parameterName;

    ObjectType(String parameterName) {
        this.parameterName = parameterName;
    }

    public String getParameterName() {
        return this.parameterName;
    }

    // From the String method, it will return you the Enum for the provided input string
    public static ObjectType fromString(String parameterName) {
        if (parameterName != null) {
            for (ObjectType objType : ObjectType.values()) {
                if (parameterName.equalsIgnoreCase(objType.parameterName)) {
                    return objType;
                }
            }
        }
        return null;
    }
}

又多了一个

   public static String fromEnumName(String parameterName) {
        if (parameterName != null) {
            for (DQJ objType : DQJ.values()) {
                if (parameterName.equalsIgnoreCase(objType.name())) {
                    return objType.parameterName;
                }
            }
        }
        return null;
    }

这将通过字符串化枚举名称返回值。例如,如果您在 fromEnumName 中提供“PERSON”,它将返回 Enum 的值,即“Person”。

原文链接:https://www.huntsbot.com/qa/07Xd/how-to-get-an-enum-value-from-a-string-value-in-java?lang=zh_CN&from=csdn

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求文章来源地址https://www.toymoban.com/news/detail-563871.html

到了这里,关于如何从Java中的字符串值中获取枚举值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java获取字符串的前几位字符

    从索引号0开始到索引好4结束(并且不包含索引4截取在内,也就是说实际截取的是0到3号字符); 运行结果如下: 1、StringUtils.substringBefore() 这里是以第一个”e”,为标准。 结果是: 2、StringUtils.substringBeforeLast() 这里以最后一个“e”为准。 结果为: 参考:java怎么获取字符

    2024年02月11日
    浏览(29)
  • Java获取字符串中逗号前的内容

    可以使用Java的 indexOf 和 substring 方法来获取字符串中逗号前的内容。 首先,使用 indexOf 方法找到逗号在字符串中的位置,然后使用 substring 方法截取字符串中从开头到逗号位置之前的内容。 例如,假设你有一个字符串 str ,它的值为 \\\"apple,banana,orange\\\",要获取逗号前的内容(也

    2024年02月16日
    浏览(31)
  • Java-json相关转换,JSONObject与实体类/map互转、List/List<map>和JSONArray互转、获取JSONObject中的key value、字符串String转换等

    博客背景是Java开发。json相关的转换、取值等在日常开发中经常使用,但有时候还是会忘记or遇到些奇奇怪怪的问题。以此记录,提醒自己~不定期更新~ 实体类和JSONObject互转 Map和JSONObject互转 String转JSONObject 实体类转JSON字符串时不过滤NULL空值 获取JSONObject中的key value List和

    2024年02月12日
    浏览(46)
  • Java中的字符串

    目录 一、简介 二、字符串定义 2.1 直接定义字符串 2.2 通过使用 String 类的构造方法来创建字符串 三、如何使用Java API帮助文档 3.1 帮助文档下载地址 3.2 帮助文档使用 3.2 中文帮助文档 四、 String字符串和int、double、float 的相互转换 4.1 String 转int 4.2 String 转Double、Float 4.3 int转

    2024年02月05日
    浏览(31)
  • Java中的字符串替换

    在Java中,String 类提供了 3 种字符串替换方法,分别是 replace()、replaceFirst() 和 replaceAll(),下面我们就来详细看一下三种的用法!     下面这套 Java300集 视频专门为零基础而制,适合准备入行Java开发的零基础,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由

    2024年02月11日
    浏览(32)
  • java判断某个字符串是否在字符串数组中的方法(4种)

    public class Demo {     public static boolean useLoop(String[] arr, String targetValue) {         for (String s : arr) {             if (s.equals(targetValue)) return true;         }         return false;     }       public static void main(String[] args) {         String arr[] = {\\\"aa\\\", \\\"bb\\\", \\\"cc\\\"};       

    2024年02月11日
    浏览(57)
  • c#如何把字符串中的指定字符删除

    可以使用以下四种方法: 一、使用:Replace public string Replace(char oldChar,char newChar); 在对象中寻找oldChar,如果寻找到,就用newChar将oldChar替换掉。 1、实例代码:   2、执行结果: 二、Remove(C#删除字符串) 1.public string Remove(int startIndex); 从startIndex位置开始,删除此位置后

    2024年02月02日
    浏览(36)
  • C++——字符串、读写文件、结构体、枚举

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,正逐渐往全干发展 📃 个人状态: 研发工程师,现效力于中国工业软件事业 🚀 人生格言: 积跬步至千里,积小流成江海 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒

    2024年04月12日
    浏览(28)
  • (三)SV结构体、枚举类型、字符串

    1、SV结构体与C语言中结构体对应 说明: student:结构体类型名,可以忽略不写的 student1, student2:结构体变量名 内部的变量:成员变量名   但常常用typedef来新定义类型,就是对其他类型取别名,方便定义变量 ,例如:  typedef struct {bit [7:0] r, g, b;} pixel_s1;//pixel_s就是对struct {bit

    2024年02月15日
    浏览(33)
  • Java中的字符串String

    目录 一、常用方法 1、字符串构造 2、String对象的比较 (1)、equals方法 (2)、compareTo方法 (3)、compareToIgnoreCase方法(忽略大小写进行比较) 3、字符串查找 4、转化 (1)数值和字符串转化 ​编辑 (2)大小写转换 (3)字符串转数组 (4)格式化 5、字符串替换 6、字符串

    2024年02月05日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包