Google Guava isNullOrEmpty untuk koleksi

102

Saya melihat bahwa Guava memiliki metode utilitas isNullOrEmpty untuk Strings

Strings.isNullOrEmpty(str)

Apakah kami memiliki sesuatu yang serupa untuk Daftar? Sesuatu seperti

Lists.isNullOrEmpty(list)

yang seharusnya setara dengan

list == null || list.isEmpty()

Juga, apakah kita memiliki sesuatu yang serupa untuk Array? Sesuatu seperti

Arrays.isNullOrEmpty(arr)

yang seharusnya setara dengan

arr == null || arr.length == 0
Ramesh
sumber

Jawaban:

141

Tidak, metode ini tidak ada di Jambu biji dan sebenarnya ada di "kuburan ide" kami.

Kami tidak percaya bahwa "adalah nol atau kosong" adalah pertanyaan yang ingin Anda tanyakan tentang koleksi.

Jika sebuah koleksi mungkin nol, dan nol harus diperlakukan sama dengan kosong, maka keluarkan semua ambiguitas itu di depan, seperti ini:

Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null) {
  foos = ImmutableSet.of();
}

atau seperti ini (jika Anda lebih suka):

Set<Foo> foos = MoreObjects.firstNonNull(
    NaughtyClass.getFoos(), ImmutableSet.<Foo>of());

Setelah itu, baru bisa digunakan .isEmpty()seperti biasa. Lakukan ini segera setelah memanggil API nakal dan Anda telah melupakan keanehan, alih-alih membiarkannya berlanjut tanpa batas.

Dan jika "null yang sebenarnya berarti koleksi kosong" tidak dikembalikan kepada Anda, tetapi diteruskan kepada Anda, tugas Anda mudah: biarkan NullPointerExceptionsaja dilemparkan, dan buat pemanggil itu terbentuk.

Kevin Bourrillion
sumber
7
Bagaimana jika beberapa framework menyetelnya ke null dan Anda tidak dapat mengontrolnya (framework pegas saat mengikat ke daftar) meskipun Anda secara eksplisit menetapkan dan menggunakan daftar kosong di objek.
OMax
15
Jawaban saya sama: coba hilangkan ambiguitas dengan menormalkan nullke koleksi kosong secepat mungkin. Jika Anda tidak bisa, maka oke, Anda mungkin salah satu dari <1% pengguna yang benar-benar ingin menulis helper isNullOrEmpty (Collection) sepele mereka sendiri.
Kevin Bourrillion
8
(atau lewati helper dan tulis saja if (collection == null || collection.isEmpty())dalam kasus di mana Anda membutuhkannya! Apakah itu sangat buruk?)
Kevin Bourrillion
13
Ini adalah jawaban beropini yang sebenarnya tidak menjawab pertanyaan itu sama sekali. Ini juga bertentangan dengan prinsip pemrograman defensif.
Neovibrant
11
@Neovibrant karena pertanyaannya adalah tentang kemampuan pustaka Guava, dan jawabannya adalah dari salah satu pengembang utama Guava, jawabannya agak tersirat: "Tidak, Jambu biji tidak memiliki itu". Jawabannya dapat ditingkatkan dengan memulai dengan pernyataan itu :)
Grundlefleck
37

Satu hal yang akan cenderung Anda temukan di seluruh Guava adalah bahwa mereka cenderung sangat antagonis terhadap nulls. Penulis ingin mencegah Anda menggunakan nullsebanyak mungkin yang Anda lakukan, dan menyediakan metode utilitas untuk membuatnya lebih mudah digunakannull akan menjadi kontraproduktif terhadap tujuan ini.

Jika Anda ingin menggunakan paradigma Guava, pertimbangkan apakah sumber koleksi (atau larik) ini benar-benar harus dikembalikan secara opsional null. Jika tidak, pertimbangkan untuk menandainya @NonNulldan mengembalikan koleksi kosong sebagai ganti null. Atau sebagai parameter untuk fungsi yang mengharapkan nulldaftar tanpa nilai, pertimbangkan untuk menggunakan Preconditions.checkNotNull, yang memunculkan pengecualian jika anull (secara tidak terduga) diteruskan.

Jika nullmemang sah, list == null || list.isEmpty()tidaklah sulit.

sinar
sumber
9
itu tidak konsisten. Argumen yang sama bisa dibuat untuk Strings, namun ada adalah Strings.isNullOrEmpty a ()
Don Cheadle
29

Ada CollectionUtils.isEmpty () di commons-collections.

Steven Schlansker
sumber
1
Sayangnya, tampaknya telah dihapus di versi yang lebih baru. Lihat org.apache.commons.collections15.CollectionUtils.
spaaarky21
1
Melihat Javadoc dari apache.commons.collection, metode isEmpty () dan isNotEmpty () masih ada di versi terbaru. collections15.CollectionUtils tampak seperti proyek independen yang mencoba memberikan dukungan umum.
proko
1
CollectionUtils.isEmpty () berguna saat bekerja dengan aplikasi lama, saat Anda tidak dapat mengubah kode depan.
Jerome Dalbert
1
kita tahu ini, tapi orang bertanya tentang jambu biji bukan tentang apache commons.
Ke Kra
9

Spring Framework memiliki kelas util khusus yang disebut CollectionUtils. Dan metode yang Anda cari adalah: org.springframework.util.CollectionUtils.isEmpty. Ini mengembalikan true untuk koleksi kosong dan kosong.

Dan untuk array ada org.springframework.util.ObjectUtils.isEmptymetode yang berperilaku hampir sama.

Lukasz
sumber
5
Meskipun mungkin aman untuk menggunakannya, kelas ini ditandai dengan komentar "Terutama untuk penggunaan internal dalam kerangka kerja". Ini berarti antarmukanya mungkin berubah pada peningkatan Musim Semi dan Anda harus melakukan pekerjaan tambahan untuk membuatnya berfungsi kembali.
Mike Minicki
2

Apache CollectionUtils 4 memiliki metode CollectionUtils.emptyIfNull () yang mengembalikan daftar kosong jika collection null. Ini sangat berguna dalam foreach loop, jadi Anda tidak perlu melakukan pemeriksaan null sebelum melakukan iterasi

Jeffrey
sumber
1

Solusi saya adalah: MoreObjects.firstNonNull (list, Collections. EmptyList ())

Saya menggunakan Guava MoreObjects dengan Koleksi JDK.

 @Test
public void listnull() {
List<String> list = null;

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}

list = new ArrayList<String>();
list.add("http://stackoverflow.com/");

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}
}
jeton
sumber
1
Ini persis seperti yang disarankan dalam jawaban atas , kecuali Anda tidak menggunakan ImmutableList.
dimo414
Saya pikir negatif karena seseorang menginginkan solusi sederhana & cepat seperti metode apache commons diNotEmpty ...
Kepada Kra
Pusat Bantuan> Hak Istimewa> Tolak Kapan saya harus memilih? Gunakan suara negatif Anda setiap kali Anda menemukan postingan yang sangat ceroboh, tanpa usaha, atau jawaban yang jelas dan mungkin sangat tidak tepat. Anda memiliki jumlah suara yang terbatas per hari, dan jawaban yang tidak diberikan membuat Anda kehilangan sedikit reputasi di atas itu; gunakan dengan bijak. stackoverflow.com/help/privileges/vote-down
jeton
Apakah menurut Anda jawaban saya adalah "sangat ceroboh, tidak perlu mengeluarkan tenaga, atau jawaban yang jelas dan mungkin sangat tidak tepat"? Jika tidak, mengapa Anda memberikan suara negatif?
jeton
0

Lihat Appache Collections CollectionUtils.isEmpty () mengembalikan nilai true jika collection kosong atau kosong

Anastasiia Kuzina
sumber