programing

Java에서 문자열 값에서 열거 값을 가져오는 방법

nicescript 2022. 8. 16. 22:14
반응형

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

유효한 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().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 예시

Enum 형식의 정적 블록 실행 순서

문자열 값에서 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.valueOflinedisplaces를 합니다.

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는 다음과 같습니다.

  1. HeaderParam 주석에서 직접 유형 변환

자체 유틸리티를 작성하지 않으려면 Google의 라이브러리를 사용하십시오.

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 Enum10가지 예시

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 defaultdefaultValuenull 해서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를 사용하기 때문입니다.getValuedrei에서공개 시킵니다.이것은 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

반응형