Google Guava, koleksiyonlar için Boş veya Boş


102

Guava'nın Strings için isNullOrEmpty yardımcı yöntemine sahip olduğunu görüyorum

Strings.isNullOrEmpty(str)

Listeler için benzer bir şeyimiz var mı? Gibi bir şey

Lists.isNullOrEmpty(list)

eşdeğer olmalıdır

list == null || list.isEmpty()

Ayrıca, Diziler için benzer bir şeyimiz var mı? Gibi bir şey

Arrays.isNullOrEmpty(arr)

eşdeğer olmalıdır

arr == null || arr.length == 0

Yanıtlar:


141

Hayır, bu yöntem Guava'da yok ve aslında bizim "fikir mezarlığımızda" var.

"Boş mu boş mu" kavramının bir koleksiyon hakkında gerçekten sormak isteyeceğiniz bir soru olduğuna inanmıyoruz.

Bir koleksiyon boş olabilirse ve null, boş olarak değerlendirilmelidir, o zaman tüm bu belirsizliği önden şu şekilde kaldırın:

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

veya bunun gibi (tercih ederseniz):

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

Bundan sonra .isEmpty()normal gibi kullanabilirsiniz . Yaramaz API'yi çağırdıktan hemen sonra bunu yapın ve süresiz devam etmesine izin vermek yerine tuhaflığı geride bırakın.

Ve eğer "gerçekten boş koleksiyon anlamına gelen boş" size iade edilmeyip size geçerse, işiniz kolaydır: sadece bir NullPointerExceptionatılsın ve o arayanı şekillendirin.


7
Ya bazı çerçeve alanı null olarak ayarlıyorsa ve nesnede açıkça boş liste ayarlamanıza ve kullanmanıza rağmen onu kontrol edemiyorsanız (listeye bağlanırken yay çerçevesi).
OMax

15
Cevabım aynı: Mümkün nullolan en kısa sürede boş bir koleksiyona normalleştirerek belirsizliği ortadan kaldırmaya çalışın . Eğer yapamıyorsanız, o zaman tamam, gerçekten kendi önemsiz isNullOrEmpty (Koleksiyon) yardımcısını yazmak isteyen kullanıcıların% 1'den azından biri olabilirsiniz.
Kevin Bourrillion

8
(veya yardımcıyı atlayın ve if (collection == null || collection.isEmpty())ihtiyacınız olan durumlarda yazın! Bu o kadar kötü mü?)
Kevin Bourrillion

13
Bu, soruyu aslında hiç ele almayan kararlı bir cevaptır. Aynı zamanda savunma programlama ilkelerine de aykırıdır.
Neovibrant

11
@Neovibrant, soru Guava kütüphanesinin yetenekleriyle ilgili olduğundan ve cevap Guava'nın lider geliştiricilerinden birinden geldiğinden, cevap bir şekilde ima ediliyor: "Hayır, Guava buna sahip değil". Cevap bu ifadeyle başlayarak iyileştirilebilir :)
Grundlefleck

37

Guava'da bulmaya eğilimli olacağınız bir şey, nulls'ye karşı çok düşman olma eğiliminde olmalarıdır . Yazarlar null, sizi muhtemelen yaptığınız kadar kullanmaktan vazgeçirmek istiyorlar ve kullanımını kolaylaştırmak için faydalı yöntemler sağlamak, nullbu amaca karşı ters etki yaratacaktır.

Guava'nın paradigmasını kullanmak istiyorsanız, bu koleksiyonun (veya dizinin) kaynağının gerçekten isteğe bağlı olarak dönmesi gerekip gerekmediğini düşünün null. Değilse, işaretlemeyi @NonNullve yerine boş koleksiyonları döndürmeyi düşünün null. Veya nulldeğersiz listeler bekleyen bir işlevin parametresi olarak , kullanmayı düşünün Preconditions.checkNotNull, eğer birnull (beklenmedik şekilde) iletilirse .

Eğer nullgerçekten meşru olduğunu, list == null || list.isEmpty()o kadar da zor değildir.


9
tutarsız. Aynı argüman Yaylılar için yapılan henüz edilebilir olan bir Strings.isNullOrEmpty ()
Don Cheadle

29

Bir var CollectionUtils.isEmpty () commons-koleksiyonlarında.


1
Ne yazık ki, daha yeni sürümlerde kaldırılmış gibi görünüyor. Bkz. Org.apache.commons.collections15.CollectionUtils.
spaaarky21

1
Apache.commons.collection'dan Javadoc'a bakıldığında isEmpty () ve isNotEmpty () yöntemleri en son sürümde hala mevcuttur. collections15.CollectionUtils jenerik destek sağlamaya çalışan bağımsız bir proje gibi görünüyor.
proko

1
CollectionUtils.isEmpty (), eski uygulamalarla çalışırken, ön kodu değiştiremediğinizde kullanışlıdır.
Jerome Dalbert

1
bunu biliyoruz, ama biri apache commons hakkında değil guava hakkında soru soruyordu.
Kra'ya

9

Spring Framework CollectionUtils,. Ve aradığınız yöntemdir: org.springframework.util.CollectionUtils.isEmpty. Boş ve boş koleksiyonlar için true döndürür.

Ve diziler için org.springframework.util.ObjectUtils.isEmptyhemen hemen aynı şekilde davranan bir yöntem vardır.


5
Kullanması muhtemelen güvenli olsa da, bu sınıf "Esas olarak çerçeve içinde dahili kullanım için" yorumuyla işaretlenmiştir. Bu, arayüzünün bir Bahar yükseltmesinde değişebileceği ve tekrar çalışması için ek çalışma yapmanız gerekeceği anlamına gelir.
Mike Minicki

2

Apache CollectionUtils 4, koleksiyon boşsa boş bir liste döndüren bir CollectionUtils.emptyIfNull () yöntemine sahiptir . Bu, foreach döngüsünde çok kullanışlıdır, bu nedenle yinelemeden önce sıfır kontrolü yapmanız gerekmez.


1

Benim çözümüm: MoreObjects.firstNonNull (list, Collections. EmptyList ())

Guava MoreObjects'i JDK Koleksiyonları ile kullanıyorum.

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

1
Bu tam olarak en üst yanıtta önerilen şeydir , ancak ImmutableList.
dimo414

Negatif düşünüyorum çünkü biri apache commons yöntemleri inNotEmpty gibi basit ve hızlı bir çözüm istiyordu ...
To Kra

Yardım Merkezi> Ayrıcalıklar> Olumsuz Oy Ver Ne zaman red oy vermeliyim? Olumsuz derecede özensiz, çaba harcanmamış bir gönderi veya açık ve belki de tehlikeli bir şekilde yanlış bir yanıtla karşılaştığınızda olumsuz oylarınızı kullanın. Günde sınırlı sayıda oyunuz var ve olumsuz oylar size küçük bir itibar kaybettiriyor; akıllıca kullanın. stackoverflow.com/help/privileges/vote-down
jeton

Cevabımın "son derece baştan savma, çaba sarf etmeyen bir gönderi mi, yoksa açıkça ve belki de tehlikeli şekilde yanlış bir cevap" olduğunu mu düşünüyorsunuz? Değilse, neden olumsuz oy veriyorsunuz?
jeton

0

Appache Collections CollectionUtils.isEmpty () öğesine bakın, koleksiyon null veya boşsa true döndürür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.