Google Guava isNullOrEmpty dla kolekcji

102

Widzę, że Guava ma metodę narzędziową isNullOrEmpty dla Strings

Strings.isNullOrEmpty(str)

Czy mamy coś podobnego do list? Coś jak

Lists.isNullOrEmpty(list)

co powinno być równoważne z

list == null || list.isEmpty()

Czy mamy coś podobnego do tablic? Coś jak

Arrays.isNullOrEmpty(arr)

co powinno być równoważne z

arr == null || arr.length == 0
Ramesh
źródło

Odpowiedzi:

141

Nie, ta metoda nie istnieje w Guava i faktycznie znajduje się na naszym „cmentarzu pomysłów”.

Nie wierzymy, że „jest pusta lub pusta” to pytanie, które naprawdę chcesz zadać na temat kolekcji.

Jeśli kolekcja może mieć wartość null, a wartość null powinna być traktowana tak samo jak pusta, usuń całą tę niejednoznaczność z góry, na przykład:

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

lub tak (jeśli wolisz):

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

Następnie możesz po prostu użyć .isEmpty() jak zwykle. Zrób to natychmiast po wywołaniu niegrzecznego API, a zostawisz za sobą dziwność, zamiast pozwalać jej trwać w nieskończoność.

A jeśli „null, które naprawdę oznacza pustą kolekcję”, nie jest zwracane do Ciebie, ale przekazywane do Ciebie, Twoja praca jest łatwa: po prostu pozwól, aby NullPointerExceptionzostał wyrzucony i nadaj rozmówcy kształt.

Kevin Bourrillion
źródło
7
Co jeśli jakiś framework ustawia to pole na null i nie możesz nim sterować (framework sprężynowy podczas wiązania z listą), chociaż jawnie ustawisz i użyjesz pustej listy w obiekcie.
OMax
15
Moja odpowiedź jest taka sama: spróbuj usunąć niejednoznaczność, normalizując ją nulldo pustej kolekcji tak szybko, jak to możliwe. Jeśli po prostu nie możesz, to w porządku, możesz być jednym z <1% użytkowników, którzy naprawdę chcą napisać własnego trywialnego pomocnika isNullOrEmpty (Collection).
Kevin Bourrillion,
8
(lub pomiń pomocnika i po prostu napisz if (collection == null || collection.isEmpty())w tych przypadkach, w których go potrzebujesz! Czy to takie złe?)
Kevin Bourrillion
13
To uparta odpowiedź, która tak naprawdę wcale nie odpowiada na to pytanie. Jest to również sprzeczne z zasadami programowania obronnego.
Neovibrant
11
@Neovibrant, ponieważ pytanie dotyczy możliwości biblioteki Guava, a odpowiedź pochodzi od jednego z głównych deweloperów Guava, odpowiedź jest trochę implikowana: „Nie, Guava tego nie ma”. Odpowiedź można jednak poprawić, zaczynając od tego stwierdzenia :)
Grundlefleck
37

Jedną z rzeczy, które można znaleźć w całej Guava, jest to, że są oni bardzo antagonistyczni w stosunku do nulls. Autorzy chcą zniechęcić Cię do używania nulltego, co prawdopodobnie robisz, a zapewnienie metod użytkowych, aby ułatwić korzystanie z nich, nullprzyniosłoby efekt przeciwny do zamierzonego.

Jeśli chcesz użyć paradygmatu Guavy, zastanów się, czy źródło tej kolekcji (lub tablicy) naprawdę powinno opcjonalnie zwrócić null. Jeśli nie, rozważ zaznaczenie tego @NonNulli zwróć puste kolekcje zamiast null. Lub jako parametr funkcji, która nie nulloczekuje list -valued, rozważ użycie Preconditions.checkNotNull, które zgłasza wyjątek, jeśli nullzostanie (nieoczekiwanie) przekazana.

Jeśli nullnaprawdę jest to uzasadnione, list == null || list.isEmpty()nie jest takie trudne.

Promień
źródło
9
jest niespójne. Ten sam argument może być wykonany na smyczki, jeszcze nie jest Strings.isNullOrEmpty ()
Don Cheadle
29

We wspólnych kolekcjach znajduje się CollectionUtils.isEmpty () .

Steven Schlansker
źródło
1
Niestety wydaje się, że został usunięty w nowszych wersjach. Zobacz org.apache.commons.collections15.CollectionUtils.
spaaarky21
1
Patrząc na Javadoc z apache.commons.collection, metody isEmpty () i isNotEmpty () nadal istnieją w najnowszej wersji. collections15.CollectionUtils wydaje się być niezależnym projektem, który stara się zapewnić ogólne wsparcie.
proko
1
CollectionUtils.isEmpty () jest przydatna podczas pracy ze starszymi aplikacjami, gdy nie można zmienić pierwotnego kodu.
Jerome Dalbert
1
wiemy o tym, ale pytano o guawę, a nie o apache commons.
Do Kra
9

Spring Framework posiada wyspecjalizowaną klasę użytkową o nazwie CollectionUtils. A metoda, której szukasz, to:org.springframework.util.CollectionUtils.isEmpty . Zwraca wartość true dla null i pustych kolekcji.

A dla tablic jest org.springframework.util.ObjectUtils.isEmptymetoda, która zachowuje się tak samo.

Łukasz
źródło
5
Chociaż prawdopodobnie jest to bezpieczne, ta klasa jest oznaczona komentarzem „Głównie do użytku wewnętrznego w ramach frameworka”. Oznacza to, że jego interfejs może się zmienić po aktualizacji Spring i będziesz musiał wykonać dodatkową pracę, aby znów działał.
Mike Minicki
2

Apache CollectionUtils 4 ma metodę CollectionUtils.emptyIfNull (), która zwraca pustą listę, jeśli kolekcja ma wartość null. Jest to bardzo przydatne w pętli foreach, więc nie musisz sprawdzać wartości null przed iteracją

Jeffrey
źródło
1

Moje rozwiązanie to: MoreObjects.firstNonNull (list, Collections. EmptyList ())

Używam Guava MoreObjects z JDK Collections.

 @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
źródło
1
Dokładnie to jest sugerowane w pierwszej odpowiedzi , z wyjątkiem tego, że nie używasz rozszerzenia ImmutableList.
dimo414
Myślę, że negatywnie, ponieważ chciałem prostego i szybkiego rozwiązania, takiego jak metody apache commons inNotEmpty ...
To Kra
Centrum pomocy> Uprawnienia> Głos przeciw Kiedy należy głosować przeciw? Swoje głosy przeciwstawiaj, ilekroć napotkasz rażąco niechlujny, niewymagający wysiłku post lub odpowiedź, która jest wyraźnie i być może niebezpiecznie nieprawidłowa. Masz ograniczoną liczbę głosów dziennie, a odpowiadanie na głosy w dół kosztuje Cię dodatkowo odrobinę reputacji; używaj ich mądrze. stackoverflow.com/help/privileges/vote-down
jeton
Czy myślisz, że moja odpowiedź brzmi: „rażąco niechlujny, niewymagający wysiłku post, czy też odpowiedź, która jest wyraźnie i być może niebezpiecznie nieprawidłowa”? Jeśli nie, dlaczego głosujesz przeciw?
jeton
0

Spójrz na kolekcje Appache CollectionUtils.isEmpty () zwraca wartość true, jeśli kolekcja ma wartość null lub jest pusta

Anastasiia Kuzina
źródło