Inilah masalah saya - saya sedang mencari (jika ada) yang setara dengan enum ArrayList.contains();
.
Berikut ini contoh masalah kode saya:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
Sekarang, saya menyadari bahwa salah ArrayList
satu Strings
akan menjadi rute yang lebih baik di sini, tetapi saya harus menjalankan konten enum saya melalui saklar / case di tempat lain. Karena itu masalah saya.
Dengan asumsi sesuatu seperti ini tidak ada, bagaimana saya bisa melakukannya?
Jawaban:
Ini harus dilakukan:
Dengan cara ini berarti Anda tidak perlu khawatir tentang menambahkan nilai enum tambahan nanti, semuanya diperiksa.
Sunting: Jika enum sangat besar Anda bisa menempelkan nilai dalam HashSet:
Maka Anda bisa melakukan:
values.contains("your string")
yang mengembalikan benar atau salah.sumber
Gunakan Apache commons lang3 lib sebagai gantinya
sumber
Kamu bisa memakai
Enum.valueOf()
Jika Anda mengharapkan pemeriksaan gagal sering, Anda mungkin lebih baik menggunakan loop sederhana seperti yang telah ditunjukkan - jika enum Anda mengandung banyak nilai, mungkin builda
HashSet
atau nilai enum serupa yang dikonversi ke string dan kueri ituHashSet
sebagai gantinya.sumber
EnumUtils.isValidEnum(MyEnum.class, myValue)
menggunakan logika yang serupa dan IMO, masuk akal untuk menambahkan seluruh perpustakaan untuk tugas sepele iniJika Anda menggunakan Java 1.8, Anda dapat memilih Stream + Lambda untuk mengimplementasikan ini:
sumber
Bahkan lebih baik:
sumber
Enak jambu biji bisa menjadi teman Anda
Seperti misalnya ini:
sumber
Anda dapat terlebih dahulu mengonversi enum ke Daftar dan kemudian menggunakan metode daftar berisi
sumber
Beberapa asumsi:
1) Tidak mencoba / menangkap, karena itu adalah kontrol aliran yang luar biasa
2) Metode 'berisi' harus cepat, karena biasanya berjalan beberapa kali.
3) Ruang tidak terbatas (umum untuk solusi biasa)
sumber
Beberapa perpustakaan telah disebutkan di sini, tetapi saya merindukan perpustakaan yang sebenarnya saya cari: Spring!
Ada ObjectUtils # containConstant yang tidak sensitif huruf secara default, tetapi bisa ketat jika Anda mau. Digunakan seperti ini:
Catatan: Saya menggunakan metode kelebihan beban di sini untuk menunjukkan cara menggunakan pemeriksaan case sensitif. Anda dapat menghilangkan boolean untuk memiliki perilaku case-sensitive.
Berhati-hatilah dengan enum besar, karena mereka tidak menggunakan implementasi Peta seperti yang dilakukan beberapa ...
Sebagai bonus, ia juga menyediakan varian case-sensitive dari valueOf: ObjectUtils # caseInsensitiveValueOf
sumber
Anda bisa menggunakan ini
YourEnum {A1, A2, B1, B2}
Pembaruan disarankan oleh @ wightwulf1944 dimasukkan untuk membuat solusi lebih efisien.
sumber
stream()
pada set berarti Anda mengulangi pada setiap elemen dalam set daripada mengambil keuntungan dari hashtable yang mendasarinya yang akan lebih cepat. Untuk meningkatkan ini, yang terbaik adalah cache Set yang dibuat dan gunakancontains()
metode itu. Jika Anda harus mendapatkan streaming, gunakanArrays.stream()
saja.Saya tidak berpikir ada, tetapi Anda dapat melakukan sesuatu seperti ini:
Edit:
Silakan lihat versi Richard tentang ini karena lebih tepat karena ini tidak akan berfungsi kecuali jika Anda mengonversinya untuk menggunakan Strings, yang dilakukan Richards.
sumber
.values()
didokumentasikan di unduh.oracle.com/javase/6/docs/api/java/lang/Enum.html ?Java Streaming menyediakan cara yang elegan untuk melakukan itu
Pengembalian: true jika ada elemen aliran yang cocok dengan nilai yang diberikan, jika tidak salah
sumber
Mengapa tidak menggabungkan balasan Pablo dengan valueOf ()?
sumber
Pendekatan ini dapat digunakan untuk memeriksa
Enum
, Anda dapat menambahkannya keUtils
kelas:Gunakan seperti ini:
sumber
Saya membuat kelas berikutnya untuk validasi ini
contoh penggunaan:
sumber
Anda dapat menggunakan
valueOf("a1")
jika Anda ingin mencari dengan menggunakan Stringsumber
Ini adalah enum, itu adalah nilai konstan jadi jika dalam pernyataan switch hanya melakukan sesuatu seperti ini:
Juga mengapa Anda perlu tahu apa yang dinyatakan sebagai konstanta?
sumber
Dengan jambu bahkan lebih sederhana:
sumber
MyEnum.values()
mengembalikan array instance MyEnum danMyEnum.value().toString()
mengembalikan representasi string dari objek array ini (hanya string seperti "[LMyEnum; @ 15b94ed3").name()
alih-alih.toString()
(kecuali Anda mengganti metode toString default). Lihat ini untuk info lebih lanjut: Perbedaan antara enum .name () dan .toString ()Ini menggabungkan semua pendekatan dari metode sebelumnya dan harus memiliki kinerja yang setara. Ini dapat digunakan untuk enum apa pun, menguraikan solusi "Edit" dari @Richard H, dan menggunakan Pengecualian untuk nilai yang tidak valid seperti @bestsss. Satu-satunya tradeoff adalah bahwa kelas perlu ditentukan, tetapi yang mengubah ini menjadi dua baris.
}
sumber
sumber
solusi untuk memeriksa apakah nilai hadir dan dapatkan nilai enum sebagai imbalan:
sumber
Yang ini bekerja untuk saya:
sumber
Jika Anda Menggunakan Java 8 atau lebih baru, Anda bisa melakukan ini:
sumber
sumber
Anda dapat menjadikannya sebagai metode berisi:
atau Anda bisa menggunakannya dengan blok kode Anda:
sumber
Anda juga dapat menggunakan: com.google.common.base.Enums
Enums.getIfPresent (varEnum.class, varToLookFor) mengembalikan Opsional
Enums.getIfPresent (fooEnum.class, myVariable) .isPresent ()? Enums.getIfPresent (fooEnum.class, myVariable) .get: fooEnum.OTHERS
sumber
Saya hanya akan menulis,
Enum # sama dengan hanya berfungsi dengan membandingkan objek.
sumber
sumber
enum
cukup kuat di Jawa. Anda dapat dengan mudah menambahkancontains
metode ke enum Anda (seperti Anda akan menambahkan metode ke kelas):sumber
s.equals("b1") || s.equals("b2")
??s.equals("xx")
untuk setiap enum yang Anda tambahkan nanti.