2345 Stimmen

Wie erhält man einen Enum-Wert aus einem String-Wert in Java?

Sagen wir, ich habe eine Aufzählung, die nur aus

public enum Blah {
    A, B, C, D
}

und ich möchte den Enum-Wert einer Zeichenkette finden, zum Beispiel "A" das hieße Blah.A . Wie wäre es möglich, dies zu tun?

Ist die Enum.valueOf() die Methode, die ich brauche? Wenn ja, wie würde ich sie anwenden?

54voto

Hans Schreuder Punkte 697

In Java 8 oder höher können Sie mit Ströme :

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

41voto

Patrick Arnesen Punkte 1028

Hier ist eine Methode, die dies für jede Enum tun kann und die Groß- und Kleinschreibung nicht berücksichtigt.

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

40voto

Peter Lawrey Punkte 511323

Verwendung von Blah.valueOf(string) ist am besten, aber Sie können auch Enum.valueOf(Blah.class, string) auch.

39voto

Manu Punkte 7673

Mein Tipp: Verwenden Sie Java 8 Streams und überprüfen Sie eine exakte Zeichenfolge:

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

Ich habe die Funktion umbenannt in fromString() da Sie sie nach dieser Konvention benennen, erhalten Sie einige Vorteile von der Sprache Java selbst; zum Beispiel:

  1. Direkte Konvertierung von Typen bei der HeaderParam-Anmerkung

30voto

Andrejs Punkte 25249

Wenn Sie kein eigenes Dienstprogramm schreiben wollen, verwenden Sie Googles Guave Bibliothek:

Enums.getIfPresent(Blah.class, "A")

Im Gegensatz zur eingebauten Java-Funktion können Sie mit dieser Funktion prüfen, ob A in Blah vorhanden ist, und sie löst keine Ausnahme aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X