Java에서 문자열 값에서 열거 값을 가져오는 방법
예를 들어 열거가 하나 있는데
public enum Blah {
A, B, C, D
}
들어 ."A"
은 '그것'이 될 이다.Blah.A
떻게게 이이 ?? ???
그 방법이 제가 필요한 방법인가요?그렇다면 어떻게 사용하나요?
ㅇㅇ.Blah.valueOf("A")
드립니다.Blah.A
.
이름은 대소문자를 포함하여 정확하게 일치해야 합니다.Blah.valueOf("a")
★★★★★★★★★★★★★★★★★」Blah.valueOf("A ")
다 IllegalArgumentException
.
방식 " " "valueOf()
★★★★★★★★★★★★★★★★★」values()
는 컴파일 시 생성되며 소스 코드에는 표시되지 않습니다.단, Javadoc에는 두 가지 방법이 모두 표시됩니다.
텍스트가 열거값과 동일하지 않은 경우 다른 해결 방법:
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;
}
}
(간단함을 위해 증명)
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().toLowerCase(),instance);
}
ENUM_MAP = Collections.unmodifiableMap(map);
}
public static MyEnum get (String name) {
return ENUM_MAP.get(name.toLowerCase());
}
}
다음 항목도 참조해 주세요.
Enum 및 Map of instance를 사용한 Oracle Java 예시
문자열 값에서 Java 열거형을 검색하려면 어떻게 해야 합니까?
사용하는 유틸리티는 다음과 같습니다.
/**
* 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;
}
그리고 enum 클래스에서는 보통 타이핑을 저장하기 위해 다음과 같이 합니다.
public static MyEnum fromString(String name) {
return getEnumFromString(MyEnum.class, name);
}
대문자는 enum을 만 하면 .Enum.valueOf
linedisplaces를 합니다.
T.class
★★★★★★에Enum.valueOf
~하듯이로T
지워진다.지워집니다.
당신은 또한 당신의 사건을 조심해야 한다.당신도 당신의 경우조심해야 합니다.설명해 주:설명하겠습니다 하자.Blah.valueOf("A")
작품,지만 동작하지만Blah.valueOf("a")
작동하지 않습니다.동작하지 않습니다.한편 그리고 다시Blah.valueOf("a".toUpperCase(Locale.ENGLISH))
일하곤 했다.효과가 있을 거야
Android에서는 sulai가 지적한 바와 같이 사용해야 합니다.
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();
}
}
다음은 모든 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()
));
}
사용이 사용됩니다.Blah.valueOf(string)
하지만,가장 좋지만을 사용할 수 있는 것이 최선이다.Enum.valueOf(Blah.class, string)
뿐만 아니라.뿐만 아니라.
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는 다음과 같습니다.
자체 유틸리티를 작성하지 않으려면 Google의 guava 라이브러리를 사용하십시오.
Enums.getIfPresent(Blah.class, "A")
내장된 Java 기능과 달리 Blah에 A가 존재하는지, 예외가 없는지 확인합시다.
다음과 같은 작업이 필요할 수 있습니다.
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;
}
문자열화된 Enum 이름별 값이 반환됩니다.예를 들어 FromEnumName에서 "Person"을 입력하면 Enum 값(즉 "Person")이 반환됩니다.
다른 방법을 입니다.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");
}
}
테스트:
System.out.println(Blah.getEnum("B").name());
// It will print B B
Java 8에서는 정적 맵 패턴이 더 쉽고 내가 선호하는 방법입니다.대신 with 을 추가할 수 있습니다.@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);
}
}
다음은 Guava 라이브러리를 사용한 솔루션입니다.메서드 getPlanet()은 대소문자를 구분하지 않으므로 getPlanet("MerCUrY")은 Planet을 반환합니다.수성.
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();
}
}
Enum(Enum).는 요즘 용하 i하고 i i i 。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;
}
}
'에 할 수 .getDescription(String lang)
예를 들어 다음과 같습니다.
String statusDescription = Status.valueOf("ACT").getDescription("en");
앞의 답변에 덧붙여 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();
}
}
}
모르는 분들을 위해 옵션에서 null을 회피하는 방법에 대해 자세히 설명하겠습니다.
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;
}
java.lang.Enum
는 Java의할 수 있는 몇 메서드를 합니다.이 메서드는 의 모든 열거형에서 사용할 수 .
- .
name()
Enum을 클릭합니다.열거형 상수를 쓰는 데 사용되는 문자열 리터럴이 해당 이름입니다. - 「」는
values()
메서드를 사용하여 Enum 유형에서 모든 Enum 상수의 배열을 가져올 수 있습니다. - 질문할는 '나', '나', '나', '나', '나', '나', '나,
valueOf()
자바, Enum, 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()
method는 Enum 상수 Gender를 반환합니다.MALLE, 그리고 그 위에 있는 발신자 이름은"MALE"
.
해시맵을 사용하는 Thrift 생성 코드에서 영감을 얻은 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;
}
}
용도:
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();
}
}
}
Apache의 commons-lang 라이브러리에는 정적 함수 org.apache.commons.lang3이 있습니다.EnumUtils.getEnum: 문자열을 Enum 유형에 매핑합니다.기본적으로 제프리 정과 같은 대답이지만, 이미 야생에 퍼져 있을 때 자신의 것을 굴릴 필요는 없습니다.
마이클 마이어스의 답변에 도움이 되는 유틸리티까지 더하면...
valueOf()
는 입력이 마음에 들지 않는 경우 두 가지 예외를 발생시킵니다.
IllegalArgumentException
NullPointerExeption
String 데이터가 데이터베이스에서 가져온 이전 버전의 열거를 포함할 수 있는 경우 등 String이 열거 값과 확실하게 일치한다는 보장이 없는 경우 이러한 요구 사항을 자주 처리해야 합니다.
다음은 전달한 문자열이 일치하지 않을 때 반환되는 기본 Enum을 정의할 수 있는 재사용 가능한 방법입니다.
private static <T extends Enum<T>> T valueOf( String name , T defaultVal) {
try {
return Enum.valueOf(defaultVal.getDeclaringClass() , name);
} catch (IllegalArgumentException | NullPointerException e) {
return defaultVal;
}
}
다음과 같이 사용합니다.
public enum MYTHINGS {
THINGONE,
THINGTWO
}
public static void main(String [] asd) {
valueOf("THINGTWO" , MYTHINGS.THINGONE);//returns MYTHINGS.THINGTWO
valueOf("THINGZERO" , MYTHINGS.THINGONE);//returns MYTHINGS.THINGONE
}
switch
되지 않았습니다). -버전은 과 같습니다.
private enum Blah {
A, B, C, D;
public static Blah byName(String name) {
switch (name) {
case "A":
return A;
case "B":
return B;
case "C":
return C;
case "D":
return D;
default:
throw new IllegalArgumentException(
"No enum constant " + Blah.class.getCanonicalName() + "." + name);
}
}
}
「」에에, 「」에 추가의 가치를 부여하지 않습니다.valueOf(String name)
method, 다른 동작을 원할 경우에만 추가 방법을 정의하는 것이 타당합니다. an an an an an an an an를 올리지 IllegalArgumentException
실장을 다음과 같이 변경할 수 있습니다.
private enum Blah {
A, B, C, D;
public static Blah valueOfOrDefault(String name, Blah defaultValue) {
switch (name) {
case "A":
return A;
case "B":
return B;
case "C":
return C;
case "D":
return D;
default:
if (defaultValue == null) {
throw new NullPointerException();
}
return defaultValue;
}
}
}
디폴트값을 지정함으로써 델은 다음 계약을 유지합니다.Enum.valueOf(String name)
도 하지 IllegalArgumentException
에도 그렇지 null
이 반환됩니다. 우리는 a a a a a a a a a a a a a a a a a를 던집니다.NullPointerException
이름이 그렇다면null
리리 and of of default
defaultValue
null
해서valueOfOrDefault
이 접근방식에서는 다음 설계를 채택하고 있습니다.Map
- .Map.getOrDefault(Object key, V defaultValue)
Java 8 java java java
나는 "blah" 이름을 찾기 위해 답을 찾고 있었고, 그 값(텍스트가 아니라)을 찾고 있었다.Manu의 답변에 따르면 다음 코드가 도움이 됩니다.
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 valueOfCode(String blahCode) throws IllegalArgumentException {
Blah blah = Arrays.stream(Blah.values())
.filter(val -> val.name().equals(blahCode))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Unable to resolve blah: " + blahCode));
return blah;
}
}
Enum value Of()
enum 클래스는 컴파일 시 자동으로 클래스의 static value Of() 메서드를 가져옵니다.valueOf() 메서드를 사용하여 지정된 String 값에 대한 열거 클래스의 인스턴스를 가져올 수 있습니다.
예를 들어 다음과 같습니다.
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.TWO.name());
}
enum Strings {
ONE, TWO, THREE
}
}
또 다른 유틸리티 캡처는 역방향입니다.이름이 아닌 Enum을 식별하는 값 사용.
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.EnumSet;
public class EnumUtil {
/**
* Returns the <code>Enum</code> of type <code>enumType</code> whose a
* public method return value of this Enum is
* equal to <code>valor</code>.<br/>
* Such method should be unique public, not final and static method
* declared in Enum.
* In case of more than one method in match those conditions
* its first one will be chosen.
*
* @param enumType
* @param value
* @return
*/
public static <E extends Enum<E>> E from(Class<E> enumType, Object value) {
String methodName = getMethodIdentifier(enumType);
return from(enumType, value, methodName);
}
/**
* Returns the <code>Enum</code> of type <code>enumType</code> whose
* public method <code>methodName</code> return is
* equal to <code>value</code>.<br/>
*
* @param enumType
* @param value
* @param methodName
* @return
*/
public static <E extends Enum<E>> E from(Class<E> enumType, Object value, String methodName) {
EnumSet<E> enumSet = EnumSet.allOf(enumType);
for (E en : enumSet) {
try {
String invoke = enumType.getMethod(methodName).invoke(en).toString();
if (invoke.equals(value.toString())) {
return en;
}
} catch (Exception e) {
return null;
}
}
return null;
}
private static String getMethodIdentifier(Class<?> enumType) {
Method[] methods = enumType.getDeclaredMethods();
String name = null;
for (Method method : methods) {
int mod = method.getModifiers();
if (Modifier.isPublic(mod) && !Modifier.isStatic(mod) && !Modifier.isFinal(mod)) {
name = method.getName();
break;
}
}
return name;
}
}
예:
public enum Foo {
ONE("eins"), TWO("zwei"), THREE("drei");
private String value;
private Foo(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
EnumUtil.from(Foo.class, "drei")
Foo.THREE
를 사용하기 때문입니다.getValue
drei에서공개 시킵니다.이것은 Foo의 최종 메서드나 정적 메서드가 아닌 고유한 퍼블릭 메서드입니다.를 들어 보다 많은 경우 Foo는 Foo가 아닌 정적 getTranslate
'하면 'dismi'를 반환하는 수 .EnumUtil.from(Foo.class, "drei", "getTranslate")
.
public enum ToggleStatusUpdate {
OFF("off", 1),
ON("on", 2);
private final String name;
private final int position;
private ToggleStatusUpdate(String name, int position) {
this.name = name;
this.position = position;
}
public String getName() {
return name;
}
public int getPosition() {
return position;
}
public static int getPositionForName(String name) {
for(ToggleStatusUpdate toggleStatusUpdate : ToggleStatusUpdate.values()) {
if (toggleStatusUpdate.getName().equals(name)) {
return toggleStatusUpdate.getPosition();
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(ToggleStatusUpdate.getPositionForName("off"));
}
}
Streams를 사용하는 Java 8에 대한 답변과 코멘트의 조합.디폴트값을 사용하여 참조용 스태틱 Map을 생성하여 늘체크를 방지합니다.
public enum Blah {
A, B, C, D, INVALID
private static final Map<String, Blah> ENUM_MAP = Stream.of(Blah.values())
.collect(Collectors.toMap(Enum::name, Function.identity()));
public static Blah of(final String name) {
return ENUM_MAP.getOrDefault(name, INVALID);
}
}
// e.g.
Blah.of("A");
A
Blah.of("X")
INVALID
이러한 프로세스를 사용하여 명령어를 문자열로 해석하여 열거하는 것을 좋아합니다.보통 1개의 열거를 "unknown"이라고 하기 때문에 다른 열거를 찾을 수 없을 때(대소문자를 구분하지 않는 경우에도), null(값이 없음을 의미) null(값이 없음을 의미합니다.그래서 저는 이 방법을 사용합니다.
static <E extends Enum<E>> Enum getEnumValue(String what, Class<E> enumClass) {
Enum<E> unknown=null;
for (Enum<E> enumVal: enumClass.getEnumConstants()) {
if (what.compareToIgnoreCase(enumVal.name()) == 0) {
return enumVal;
}
if (enumVal.name().compareToIgnoreCase("unknown") == 0) {
unknown=enumVal;
}
}
return unknown;
}
Kotlin 솔루션
를 만들고 '는 내선번호입니다.valueOf<MyEnum>("value")
.
inline fun <reified T : Enum<T>> valueOf(type: String): T? {
return try {
java.lang.Enum.valueOf(T::class.java, type)
} catch (e: Exception) {
null
}
}
해, 「발신자」를 호출할 도 있습니다.valueOf<MyEnum>("value", MyEnum.FALLBACK)
응답을 할 수 .
inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T {
return try {
java.lang.Enum.valueOf(T::class.java, type)
} catch (e: Exception) {
default
}
}
또는 둘 다 원하는 경우 두 번째 항목을 만드십시오.
inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T = valueOf<T>(type) ?: default
언급URL : https://stackoverflow.com/questions/604424/how-to-get-an-enum-value-from-a-string-value-in-java
'programing' 카테고리의 다른 글
ie 11에서 실행되는 Nuxt.js 설정 방법 (0) | 2022.08.16 |
---|---|
마우스 정지 후만 Vue 마우스 이동 (0) | 2022.08.16 |
웹 팩 및 Vuejs 툴바와 함께 전체 PDF.js 뷰어를 사용하는 방법 (0) | 2022.08.16 |
모바일에서의 여백/패딩 - Quasar Framework (VueJ) (0) | 2022.08.16 |
Vue 컴포넌트에 동적으로 속성 추가 (0) | 2022.08.16 |