Google Guava istNullOrEmpty für Sammlungen

102

Ich sehe, dass Guava die Dienstprogrammmethode isNullOrEmpty für Strings hat

Strings.isNullOrEmpty(str)

Haben wir etwas Ähnliches für Listen? Etwas wie

Lists.isNullOrEmpty(list)

das sollte gleichbedeutend sein mit

list == null || list.isEmpty()

Haben wir auch etwas Ähnliches für Arrays? Etwas wie

Arrays.isNullOrEmpty(arr)

das sollte gleichbedeutend sein mit

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

Antworten:

141

Nein, diese Methode gibt es in Guave nicht und sie befindet sich tatsächlich auf unserem "Ideenfriedhof".

Wir glauben nicht, dass "null oder leer" eine Frage ist, die Sie jemals wirklich zu einer Sammlung stellen möchten.

Wenn eine Sammlung null sein könnte und null genauso wie leer behandelt werden sollte, sollten Sie all diese Unklarheiten wie folgt aus dem Weg räumen:

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

oder so (wenn Sie es vorziehen):

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

Danach können Sie einfach .isEmpty()wie gewohnt verwenden. Tun Sie dies sofort, nachdem Sie die ungezogene API aufgerufen haben, und Sie haben die Verrücktheit hinter sich gelassen, anstatt sie unbegrenzt weiterlaufen zu lassen.

Und wenn die "Null, die wirklich leere Sammlung bedeutet" nicht an Sie zurückgegeben, sondern an Sie übergeben wird, ist Ihre Aufgabe einfach: Lassen Sie einfach einen NullPointerExceptionwerfen und lassen Sie diesen Anrufer in Form kommen.

Kevin Bourrillion
quelle
7
Was ist, wenn ein Framework das Feld auf null setzt und Sie es nicht steuern können (Spring Framework beim Binden an die Liste), obwohl Sie eine leere Liste im Objekt explizit festlegen und verwenden.
OMax
15
Meine Antwort ist dieselbe: Versuchen Sie, die Mehrdeutigkeit zu beseitigen, indem nullSie so schnell wie möglich auf eine leere Sammlung normalisieren . Wenn Sie es einfach nicht können, dann sind Sie vielleicht einer der <1% der Benutzer, die wirklich ihren eigenen trivialen isNullOrEmpty (Collection) -Helfer schreiben möchten.
Kevin Bourrillion
8
(oder überspringen Sie den Helfer und schreiben if (collection == null || collection.isEmpty())Sie einfach in den Fällen , in denen Sie es brauchen! Ist das so schlimm?)
Kevin Bourrillion
13
Dies ist eine meinungsgebundene Antwort, die die Frage überhaupt nicht anspricht. Es verstößt auch gegen defensive Programmierprinzipien.
Neovibrant
11
@Neovibrant Da es sich bei der Frage um die Funktionen der Guava-Bibliothek handelt und die Antwort von einem der Hauptentwickler von Guava stammt, ist die Antwort ein bisschen impliziert: "Nein, Guava hat das nicht". Die Antwort kann verbessert werden, indem man mit dieser Aussage beginnt :)
Grundlefleck
37

Eine Sache, die Sie in ganz Guave finden werden, ist, dass sie sehr antagonistisch gegenüber nulls sind. Die Autoren möchten Sie davon abhalten, nullso viel wie möglich zu verwenden, und Dienstprogrammmethoden bereitstellen, um die Verwendung zu vereinfachennull wäre gegen dieses Ziel kontraproduktiv.

Wenn Sie das Guava-Paradigma verwenden möchten, überlegen Sie, ob die Quelle dieser Sammlung (oder dieses Arrays) wirklich optional zurückgegeben werden sollte null. Wenn nicht, markieren Sie es @NonNullund geben Sie stattdessen leere Sammlungen zurück null. Oder als Parameter für eine Funktion, die nullListen ohne Wert erwartet , sollten Sie die Verwendung in Betracht ziehen Preconditions.checkNotNull, die eine Ausnahme auslöst, wenn anull (unerwartet) übergeben wird.

Wenn es nullwirklich legitim ist, list == null || list.isEmpty()ist es nicht so schwer.

Strahl
quelle
9
es ist inkonsistent. Das gleiche Argument könnte für Strings gemacht werden, aber es gibt eine Strings.isNullOrEmpty ()
Don Cheadle
29

Es gibt eine CollectionUtils.isEmpty () in Commons-Sammlungen.

Steven Schlansker
quelle
1
Leider scheint es in neueren Versionen entfernt worden zu sein. Siehe org.apache.commons.collections15.CollectionUtils.
spaaarky21
1
Wenn Sie sich das Javadoc aus apache.commons.collection ansehen, sind die Methoden isEmpty () und isNotEmpty () in der neuesten Version noch vorhanden. collection15.CollectionUtils scheint ein unabhängiges Projekt zu sein, das versucht, generische Unterstützung bereitzustellen.
Proko
1
CollectionUtils.isEmpty () ist nützlich, wenn Sie mit älteren Apps arbeiten, wenn Sie den Vorabcode nicht ändern können.
Jerome Dalbert
1
wir wissen das, aber man fragte nach Guave, nicht nach Apache Commons.
Zu Kra
9

Spring Framework hat eine spezialisierte Util-Klasse namens CollectionUtils. Und die Methode, die Sie suchen, ist : org.springframework.util.CollectionUtils.isEmpty. Es gibt true für null und leere Sammlungen zurück.

Und für Arrays gibt es eine org.springframework.util.ObjectUtils.isEmptyMethode, die sich ziemlich gleich verhält.

Lukasz
quelle
5
Obwohl es wahrscheinlich sicher ist, es zu verwenden, ist diese Klasse mit dem Kommentar "Hauptsächlich für den internen Gebrauch innerhalb des Frameworks" gekennzeichnet. Dies bedeutet, dass sich die Benutzeroberfläche bei einem Spring-Upgrade möglicherweise ändert und Sie zusätzliche Arbeiten ausführen müssen, damit es wieder funktioniert.
Mike Minicki
2

Apache CollectionUtils 4 verfügt über eine Methode CollectionUtils.emptyIfNull () , die eine leere Liste zurückgibt, wenn die Sammlung null ist. Dies ist in einer foreach-Schleife sehr nützlich, sodass Sie vor dem Iterieren keine Nullprüfung durchführen müssen

Jeffrey
quelle
1

Meine Lösung lautet: MoreObjects.firstNonNull (Liste, Sammlungen. Leere Liste ())

Ich verwende Guava MoreObjects mit JDK-Sammlungen.

 @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
quelle
1
Dies ist genau das, was in der oberen Antwort vorgeschlagen wird , außer Sie verwenden keine ImmutableList.
dimo414
Ich denke negativ, weil man eine einfache und schnelle Lösung wie Apache Commons Methoden inNotEmpty wollte ...
Zu Kra
Hilfe> Privilegien> Abstimmen Wann soll ich abstimmen? Verwenden Sie Ihre Downvotes immer dann, wenn Sie auf einen ungeheuer schlampigen, mühelosen Beitrag oder eine Antwort stoßen, die eindeutig und möglicherweise gefährlich falsch ist. Sie haben eine begrenzte Anzahl von Stimmen pro Tag, und die Beantwortung von Abstimmungen kostet Sie zusätzlich ein kleines bisschen Ansehen. benutze sie mit Bedacht. stackoverflow.com/help/privileges/vote-down
jeton
Denken Sie, meine Antwort ist "ungeheuer schlampiger, müheloser Beitrag oder eine Antwort, die eindeutig und vielleicht gefährlich falsch ist"? Wenn nicht, warum stimmen Sie negativ ab?
Jeton
0

Schauen Sie sich Appache Collections CollectionUtils.isEmpty () an, das true zurückgibt, wenn die Auflistung null oder leer ist

Anastasiia Kuzina
quelle