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

这篇博客讨论了如何在Java中从字符串值获取枚举类型值的不同方法,包括使用枚举的name()方法、Google Guava库、Apache Commons Lang以及Java 8的Stream API等。还涉及了处理大小写不敏感的情况和处理无效输入的策略。
摘要由CSDN通过智能技术生成

说我有一个枚举

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

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

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


#1楼

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

/**
 * A common method for all enums since they can't have another base class
 * @param <T> Enum type
 * @param c enum type. All enums must be all caps.
 * @param string case insensitive
 * @return corresponding enum, or null
 */
public static <T extends Enum<T>> T getEnumFromString(Class<T> 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被删除了, Enum.valueOf我不能对Enum.valueOf使用T.class


#2楼

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

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

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


#3楼

使用Guava库的解决方案。 方法getPlanet()不区分大小写,因此getPlanet(“ MerCUrY”)将返回Planet.MERCURY。

package com.universe.solarsystem.planets;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Enums;
import com.google.common.base.Optional;

//Pluto and Eris are dwarf planets, who cares!
public enum Planet {
   MERCURY,
   VENUS,
   EARTH,
   MARS,
   JUPITER,
   SATURN,
   URANUS,
   NEPTUNE;

   public static Planet getPlanet(String name) {
      String val = StringUtils.trimToEmpty(name).toUpperCase();
      Optional <Planet> possible = Enums.getIfPresent(Planet.class, val);
      if (!possible.isPresent()) {
         throw new IllegalArgumentException(val + "? There is no such planet!");
      }
      return possible.get();
   }
}

#4楼

为了增加以前的答案,并解决有关null和NPE的一些讨论,我使用Guava Optionals处理缺席/无效案件。 这非常适合URI /参数解析。

public enum E {
    A,B,C;
    public static Optional<E> fromString(String s) {
        try {
            return Optional.of(E.valueOf(s.toUpperCase()));
        } catch (IllegalArgumentException|NullPointerException e) {
            return Optional.absent();
        }
    }
}

对于那些不知道的人,这里有一些有关使用Optional避免null的更多信息: https : //code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained#Optional


#5楼

java.lang.Enum定义了几种有用的方法,这些方法可用于Java中的所有枚举类型:

  • 您可以使用name()方法获取任何Enum常量的名称。 用于写枚举常量的字符串文字是它们的名称。
  • 类似地, values()方法可用于从Enum类型获取所有Enum常量的数组。
  • 对于询问的问题,可以使用valueOf()方法将Java中的任何String转换为Enum常量,如下所示。
public class EnumDemo06 {
    public static void main(String args[]) {
        Gender fromString = Gender.valueOf("MALE");
        System.out.println("Gender.MALE.name() : " + fromString.name());
    }

    private enum Gender {
        MALE, FEMALE;
    }
}

Output:
Gender.MALE.name() : MALE

在此代码段中, valueOf()方法返回一个Enum常量Gender.MALE,对其调用的名称将返回"MALE"


#6楼

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

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

#7楼

您可能需要这样做:

public enum Obj
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值