枚举类是这样的:
public enum UserRoles {
ADMIN, TEST
}
并且我想处理它,因此,如果枚举中没有任何值,则不应抛出异常。我这样处理:
for(String roleString : roleStrings){
if(roleString.isEmpty())
continue;
UserRoles userRole;
try {
userRole = UserRoles.valueOf(roleString);
} catch(IllegalArgumentException e) {
continue;
}
accountRoles.add(userRole);
}
有更好的方法吗?
答案 0 :(得分:2)
您可以执行此操作的一种方法是,在枚举内部显式创建一个静态HashMap。如果您期望有很多不匹配的值,则可能会很有用,因为例外通常是(相对)昂贵的操作。否则,您的工作方式会很好。
import java.util.HashMap;
public class Test {
public static enum UserRoles {
ADMIN, USER;
private static HashMap<String, UserRoles> roles;
static {
roles = new HashMap<>();
for (UserRoles r : UserRoles.values()) {
roles.put(r.toString(), r);
}
}
public static UserRoles parse(String s) {
return roles.get(s);
}
}
public static void main(String... args) {
System.out.println(UserRoles.parse("ADMIN"));
System.out.println(UserRoles.parse("FOO"));
}
}
答案 1 :(得分:1)
您可以使用Streams
来更短地处理它:
Map
作为键保存一个String
,并将常数保存为值enum UserRoles {
ADMIN, TEST;
static Map<String, UserRoles> map = Arrays.stream(values())
.collect(toMap(Enum::toString, Function.identity()));
static List<UserRoles> parseAll(List<String> roleStrings) {
return roleStrings.stream() // Stream<String>
.map(String::toUpperCase) // Stream<String>
.map(map::get) // Stream<UserRoles>
.filter(Objects::nonNull) // Stream<UserRoles>
.collect(Collectors.toList()); // List<UserRoles>
}
}
并用作
public static void main(String[] args) {
List<String> roleStrings = Arrays.asList("", "ADMIN", "te", "test");
List<UserRoles> accountRoles = UserRoles.parseAll(roleStrings);
System.out.println(accountRoles); //[ADMIN, TEST]
}
答案 2 :(得分:0)
您可以引入一个静态方法,该方法将为您获取 Enum 值,否则返回null
。
enum UserRoles {
ADMIN, TEST;
public static UserRoles fetchValue(String constant) {
return Arrays.stream(UserRoles.values())
.filter(e -> e.name().equals(constant))
.findFirst()
.orElse(null);
}
}
现在,即使未找到 Enum 常量,也将返回null
而不是引发异常。如下使用它:
UserRoles userRole = UserRoles.fetchValue(str);
if (userRole != null) {
accountRoles.add(userRole);
}