Pertanyaan Cari Java enum dengan nilai string


Katakan saya punya enum yang adil

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

dan saya ingin mencari nilai enum string, misalnya "A" yang akan terjadi Blah.A. Bagaimana mungkin untuk melakukan ini?

Adalah Enum.valueOf() metode yang saya butuhkan? Jika ya, bagaimana saya menggunakan ini?


1590
2018-03-02 22:56


asal


Jawaban:


Iya nih, Blah.valueOf("A") akan memberimu Blah.A.

Perhatikan bahwa nama harus berupa nama tepat cocok, termasuk casing: Blah.valueOf("a") dan Blah.valueOf("A ") keduanya melempar IllegalArgumentException.

Metode statis valueOf() dan values() dibuat pada waktu kompilasi dan tidak muncul dalam kode sumber. Mereka memang muncul di Javadoc; sebagai contoh, Dialog.ModalityType menunjukkan kedua metode.


1851
2018-03-02 22:57



Solusi lain jika teks tidak sama dengan nilai enumerasi:

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

709
2018-06-03 10:57



Ini adalah utilitas bagus yang saya gunakan:

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

Kemudian di kelas enum saya biasanya memiliki ini untuk menyimpan beberapa pengetikan:

public static MyEnum fromString(String name) {
    return getEnumFromString(MyEnum.class, name);
}

Jika enum Anda tidak semuanya tutup, cukup ubah Enum.valueOf garis.

Sayang sekali aku tidak bisa menggunakannya T.class untuk Enum.valueOf sebagai T terhapus.


98
2017-11-12 15:52



Anda juga harus berhati-hati dengan kasus Anda. Biar saya jelaskan: lakukan Blah.valueOf("A") bekerja, tapi Blah.valueOf("a") Tidak akan berhasil. Kemudian lagi Blah.valueOf("a".toUpperCase(Locale.ENGLISH)) akan bekerja.

sunting
Berubah toUpperCase untuk toUpperCase(Locale.ENGLISH) berdasarkan tc. komentar dan dokumen java

edit2 Di android Anda harus menggunakan Locale.US, sebagai sulai menunjukkan.


66
2018-05-09 16:33



Gunakan pola dari Joshua Bloch, Java yang efektif:

(disederhanakan untuk keringkasan)

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(),instance);
    }
    ENUM_MAP = Collections.unmodifiableMap(map);
  }

  public static MyEnum get (String name) {
    return ENUM_MAP.get(name);
  }
}

Juga lihat:

Oracle Java Example menggunakan Enum dan Map of instance

Perintah eksekusi dari blok statis dalam tipe Enum

Bagaimana saya bisa mencari enum Java dari nilai String-nya


37
2018-06-15 16:37



Berikut adalah metode yang dapat melakukannya untuk Enum apa pun, dan tidak peka huruf besar / kecil.

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

35
2017-12-01 21:53



Menggunakan Blah.valueOf(string) adalah yang terbaik tetapi dapat Anda gunakan Enum.valueOf(Blah.class, string) demikian juga.


28
2018-05-09 17:23



Jika Anda tidak ingin menulis utilitas Anda sendiri menggunakan Google  Perpustakaan:

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

Tidak seperti fungsi java yang dibangun itu mari kita periksa apakah A hadir dalam Blah dan tidak melempar pengecualian.


22
2018-04-02 20:12



Anda mungkin perlu ini:

public enum ObjectType {
    PERSON("Person");

    public String parameterName;

    ObjectType(String parameterName) {
        this.parameterName = parameterName;
    }

    public String getParameterName() {
        return this.parameterName;
    }

    //From String method 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;
    }
}

Satu tambahan lagi:

   public static String fromEnumName(String parameterName) {
        if (parameterName != null) {
            for (DQJ objType : DQJ.values()) {
                if (parameterName.equalsIgnoreCase(objType.name())) {
                    return objType.parameterName;
                }
            }
        }
        return null;
    }

Ini akan mengembalikan Anda Nilai dengan Nama Enum Stringified Untuk mis. jika Anda memberikan "PERSON" di fromEnumName, itu akan mengembalikan Anda Nilai Enum i.e. "Orang"


13
2017-07-02 11:54



Cara lain untuk melakukan ini dengan menggunakan metode statis implisit name() dari Enum. nama akan mengembalikan string yang tepat yang digunakan untuk membuat enum yang dapat digunakan untuk memeriksa string yang disediakan:

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

Pengujian:

System.out.println(Blah.getEnum("B").name()); 

//it will print B  B

inspirasi: 10 Contoh Enum di Jawa


11
2017-11-29 05:02



Di Java 8 atau yang lebih baru, gunakan Streaming:

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 fromText(String text) {
        return Arrays.stream(values())
          .filter(bl -> bl.text.equalsIgnoreCase(text))
          .findFirst()
          .orElse(null);
    }
}

10
2017-08-01 10:17