说我有一个只是的枚举
public enum Blah {
A, B, C, D
}
Run Code Online (Sandbox Code Playgroud)
我想找到一个字符串的枚举值,例如"A"
,这将是Blah.A
.怎么可能这样做?
Enum.valueOf()
我需要的方法是什么?如果是这样,我将如何使用它?
Mic*_*ers 2167
是的,Blah.valueOf("A")
会给你的Blah.A
.
请注意,名称必须是完全匹配,包括大小写:Blah.valueOf("a")
并且Blah.valueOf("A ")
两者都抛出IllegalArgumentException
.
静态方法valueOf()
和values()
在编译时创建并不会出现在源代码.但它们确实出现在Javadoc中; 例如,Dialog.ModalityType
显示两种方法.
Jos*_*éMi 826
如果文本与枚举值不同,则为另一种解决方案:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Geo*_*eng 118
这是我使用的一个漂亮的实用程序:
/**
* 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;
}
Run Code Online (Sandbox Code Playgroud)
然后在我的枚举类中,我通常会这样做以节省一些输入:
public static MyEnum fromString(String name) {
return getEnumFromString(MyEnum.class, name);
}
Run Code Online (Sandbox Code Playgroud)
如果您的枚举不是全部大写,只需更改该Enum.valueOf
行即可.
太糟糕了,我不能使用T.class
的Enum.valueOf
是T
被删除.
Dar*_*gue 85
使用来自Joshua Bloch,Effective Java的模式:
(为简洁起见,简化)
enum MyEnum {
ENUM_1("A"),
ENUM_2("B");
private String name;
private static final Map<String,MyEnum> 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<String,MyEnum> map = new ConcurrentHashMap<String, MyEnum>();
for (MyEnum instance : MyEnum.values()) {
map.put(instance.getName(),instance);
}
ENUM_MAP = Collections.unmodifiableMap(map);
}
public static MyEnum get (String name) {
return ENUM_MAP.get(name);
}
}
Run Code Online (Sandbox Code Playgroud)
另见:
Joã*_*ela 74
你也应该小心你的情况.让我解释一下:做Blah.valueOf("A")
工作,但Blah.valueOf("a")
不行.然后再次Blah.valueOf("a".toUpperCase(Locale.ENGLISH))
工作.
编辑
已更改toUpperCase
为toUpperCase(Locale.ENGLISH)
基于tc.评论和java文档
edit2
在Android上你应该使用Locale.US
,正如sulai指出的那样.
Pat*_*sen 38
这是一个可以为任何Enum执行此操作的方法,并且不区分大小写.
/**
* Finds the value of the given enumeration by name, case-insensitive.
* Throws an IllegalArgumentException if no match is found.
**/
public static <T extends Enum<T>> T valueOfIgnoreCase(
Class<T> 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()
));
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*rey 35
使用Blah.valueOf(string)
是最好的,但你也可以使用Enum.valueOf(Blah.class, string)
.
Han*_*der 32
在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<Blah> fromText(String text) {
return Arrays.stream(values())
.filter(bl -> bl.text.equalsIgnoreCase(text))
.findFirst();
}
}
Run Code Online (Sandbox Code Playgroud)
And*_*ejs 28
如果您不想编写自己的实用程序,请使用Google的guava库:
Enums.getIfPresent(Blah.class, "A")
Run Code Online (Sandbox Code Playgroud)
与内置的java函数不同,它让你检查Blah中是否存在A并且不会抛出异常.
Man*_*anu 25
我的2美分:使用Java8 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));
}
}
Run Code Online (Sandbox Code Playgroud)
**编辑**
将函数重命名为fromString()
自使用该约定命名后,您将从Java语言本身获得一些好处; 例如:
Mur*_*ala 16
您可能需要这样:
public enum ObjectType {
PERSON("Person");
public String parameterName;
ObjectType(String parameterName) {
this.parameterName = parameterName;
}
public String getParameterName() {
return this.parameterName;
}
//From String method 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;
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个补充:
public static String fromEnumName(String parameterName) {
if (parameterName != null) {
for (DQJ objType : DQJ.values()) {
if (parameterName.equalsIgnoreCase(objType.name())) {
return objType.parameterName;
}
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
这将通过字符串化的枚举名称返回值.例如,如果您在fromEnumName中提供"PERSON",它将返回Enum的值,即"Person"
小智 13
另一种方法是使用name()
Enum的隐式静态方法.name将返回用于创建该枚举的确切字符串,该字符串可用于检查提供的字符串:
public enum Blah {
A, B, C, D;
public static Blah getEnum(String s){
if(A.name().equals(s)){
return A;
}else if(B.name().equals(s)){
return B;
}else if(C.name().equals(s)){
return C;
}else if (D.name().equals(s)){
return D;
}
throw new IllegalArgumentException("No Enum specified for this string");
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
System.out.println(Blah.getEnum("B").name());
//it will print B B
Run Code Online (Sandbox Code Playgroud)
jav*_*rew 10
使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
枚举非常有用。我一直在使用Enum
很多为不同语言的某些字段添加描述,如下例:
public enum Status {
ACT(new String[] { "Accepted", "?????" }),
REJ(new String[] { "Rejected", "?????" }),
PND(new String[] { "Pending", "?? ????????" }),
ERR(new String[] { "Error", "???" }),
SNT(new String[] { "Sent", "?????" });
private String[] status;
public String getDescription(String lang) {
return lang.equals("en") ? status[0] : status[1];
}
Status(String[] status) {
this.status = status;
}
}
Run Code Online (Sandbox Code Playgroud)
然后您可以根据传递给getDescription(String lang)
方法的语言代码动态检索描述,例如:
String statusDescription = Status.valueOf("ACT").getDescription("en");
Run Code Online (Sandbox Code Playgroud)
在Java 8中,静态Map模式更容易,是我的优先方法.如果你想使用Enum with Jackson,你可以覆盖toString并使用它代替名称,然后用.注释@JsonValue
public enum MyEnum {
BAR,
BAZ;
private static final Map<String, MyEnum> MAP = Stream.of(MyEnum.values()).collect(Collectors.toMap(Enum::name, Function.identity()));
public static MyEnum fromName(String name){
return MAP.get(name);
}
}
public enum MyEnumForJson {
BAR("bar"),
BAZ("baz");
private static final Map<String, MyEnumForJson> MAP = Stream.of(MyEnumForJson.values()).collect(Collectors.toMap(Object::toString, Function.identity()));
private final String value;
MyEnumForJson(String value) {
this.value = value;
}
@JsonValue
@Override
public String toString() {
return value;
}
public static MyEnumForJson fromValue(String value){
return MAP.get(value);
}
}
Run Code Online (Sandbox Code Playgroud)
要添加到先前的答案,并解决围绕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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于那些不知道的人,这里有一些关于使用Optional避免null的更多信息:https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained#Optional
public static MyEnum getFromValue(String value) {
MyEnum resp = null;
MyEnum nodes[] = values();
for(int i = 0; i < nodes.length; i++) {
if(nodes[i].value.equals(value)) {
resp = nodes[i];
break;
}
}
return resp;
}
Run Code Online (Sandbox Code Playgroud)
java.lang.Enum
定义了几个有用的方法,适用于Java中的所有枚举类型:
name()
方法获取任何 Enum 常量的名称。用于编写枚举常量的字符串文字是它们的名称。values()
方法可用于从 Enum 类型获取所有 Enum 常量的数组。valueOf()
方法将任何 String 转换为 Java 中的 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
Run Code Online (Sandbox Code Playgroud)
在此代码片段中,该valueOf()
方法返回一个枚举常量Gender.MALE,并调用 name 来返回"MALE"
。
O(1)方法的灵感来自使用哈希表的节俭生成的代码。
public enum USER {
STUDENT("jon",0),TEACHER("tom",1);
private static final Map<String, Integer> map = new HashMap<>();
static {
for (USER user : EnumSet.allOf(USER.class)) {
map.put(user.getTypeName(), user.getIndex());
}
}
public static int findIndexByTypeName(String typeName) {
return map.get(typeName);
}
private USER(String typeName,int index){
this.typeName = typeName;
this.index = index;
}
private String typeName;
private int index;
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
Run Code Online (Sandbox Code Playgroud)
枚举 valueOf()
枚举类在编译时会自动获取类中的静态 valueOf() 方法。valueOf() 方法可用于获取给定 String 值的枚举类的实例。
例如:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.TWO.name());
}
enum Strings {
ONE, TWO, THREE
}
}
Run Code Online (Sandbox Code Playgroud)
Apache 的commons-lang库有一个静态函数org.apache.commons.lang3.EnumUtils.getEnum,它将把一个 String 映射到你的 Enum 类型。基本上与Geoffrey Zheng 的答案相同,但是当它已经在野外时,没有必要推出自己的答案。
用:
public enum MyEnum {
FIRST,
SECOND,
THIRD;
public static Optional<MyEnum> fromString(String value) {
try {
return Optional.of(MyEnum.valueOf(value));
}catch(Exception e) {
return Optional.empty();
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1063121 次 |
最近记录: |