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

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

技术背景

在Java编程中,枚举(Enum)是一种特殊的数据类型,它限制变量只能是预先设定好的值。在实际开发中,经常会遇到需要将字符串值转换为枚举值的场景,例如从配置文件、用户输入或数据库中获取字符串,然后将其转换为对应的枚举类型。

实现步骤

1. 使用Enum.valueOf()方法

这是最直接的方法,要求字符串与枚举常量的名称完全匹配,包括大小写。

1
2
3
4
5
6
7
8
9
10
public enum Blah {
A, B, C, D
}

public class Main {
public static void main(String[] args) {
Blah value = Blah.valueOf("A");
System.out.println(value);
}
}

2. 自定义转换方法

当字符串与枚举常量的名称不完全匹配时,可以自定义方法进行转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;
}
}

public class Main {
public static void main(String[] args) {
Blah value = Blah.fromString("text1");
System.out.println(value);
}
}

3. 使用Java 8的Stream API

在Java 8及以后的版本中,可以使用Stream API进行枚举值的查找。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Arrays;
import java.util.Optional;

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

public class Main {
public static void main(String[] args) {
Optional<Blah> value = Blah.fromText("text1");
value.ifPresent(System.out::println);
}
}

核心代码

以下是几种常见方法的核心代码示例:

Enum.valueOf()方法

1
Blah value = Blah.valueOf("A");

自定义转换方法

1
2
3
4
5
6
7
8
public static Blah fromString(String text) {
for (Blah b : Blah.values()) {
if (b.text.equalsIgnoreCase(text)) {
return b;
}
}
return null;
}

Java 8 Stream API方法

1
2
3
4
5
public static Optional<Blah> fromText(String text) {
return Arrays.stream(values())
.filter(bl -> bl.text.equalsIgnoreCase(text))
.findFirst();
}

最佳实践

  • 使用Enum.valueOf()方法:当字符串与枚举常量的名称完全匹配时,优先使用该方法,因为它是Java内置的方法,简洁高效。
  • 自定义转换方法:当字符串与枚举常量的名称不完全匹配时,自定义方法可以灵活处理这种情况。在自定义方法中,可以根据需要进行大小写忽略、去除空格等操作。
  • 使用Stream API:在Java 8及以后的版本中,使用Stream API可以使代码更加简洁和易读,同时还可以利用Optional类型避免空指针异常。

常见问题

  • IllegalArgumentException异常:当使用Enum.valueOf()方法时,如果传入的字符串与任何枚举常量的名称都不匹配,会抛出IllegalArgumentException异常。可以通过捕获该异常或使用自定义方法来避免。
  • 大小写问题Enum.valueOf()方法是区分大小写的,如果传入的字符串大小写与枚举常量的名称不一致,会抛出异常。可以在自定义方法中使用equalsIgnoreCase()方法来忽略大小写。
  • 性能问题:在自定义方法中,如果枚举的数量较多,使用循环遍历可能会影响性能。可以考虑使用Map来存储枚举值,以提高查找效率。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

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

static {
Map<String, MyEnum> map = new HashMap<>();
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());
}
}

Java中如何从字符串值获取枚举值
https://119291.xyz/posts/2025-04-24.java-get-enum-value-from-string/
作者
ww
发布于
2025年4月24日
许可协议