Best Practice zum Überprüfen der Null- und Leersammlung in Java


209

Ich möchte überprüfen, ob eine Sammlung leer ist und null. Könnte mir bitte jemand die beste Vorgehensweise mitteilen?

Derzeit überprüfe ich Folgendes:

if (null == sampleMap || sampleMap.isEmpty()) {
  // do something
} 
else {
  // do something else
}

10
Denken Sie neben allem anderen darüber nach, warum Sie null == sampleMapeher als verwenden sampleMap == null. Die meisten Leute finden Letzteres besser lesbar - Ersteres ist ein Überbleibsel aus anderen Sprachen.
Jon Skeet

6
Die Nullsammlung ist übrigens schlecht. Wenn möglich, machen Sie es stattdessen leer Sammlung. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
gy 声 远 Shengyuan Lu

@ JonSkeet-Leute verwenden null == sampleMap, falls sie = anstelle von == schreiben. Wenn Sie sampleMap == null verwenden und one = vergessen, wird es sampleMap = null, was keinen Fehler auslöst. Wenn Sie es also anders schreiben, kann der Entwickler es besser erkennen
Uri Loya,

1
@UriLoya: Wenn Sie if (null = sampleMap)in Java schreiben , wird ein Kompilierungsfehler angezeigt . Genau darum geht es in meinem ersten Kommentar. Der "Grund" dafür ist sprachspezifisch, wurde jedoch trotz der Lesbarkeitsstrafe auf andere Sprachen übertragen, da die Leute nicht darüber nachgedacht haben, warum sie das tun.
Jon Skeet

Sie können die CollectionUtils-Klasse verwenden, die im Paket org.apache.commons.collections4.CollectionUtils enthalten ist. Es gibt viele Dienstprogrammmethoden, um leer oder null zu finden.
Vikash

Antworten:


312

Wenn Sie die Apache Commons-Sammlungsbibliothek in Ihrem Projekt verwenden, können Sie die Methoden CollectionUtils.isEmptyund MapUtils.isEmpty()verwenden, die jeweils prüfen, ob eine Sammlung oder eine Karte leer oder null ist (dh sie sind "null-sicher").

Der Code hinter diesen Methoden ist mehr oder weniger der, den Benutzer @icza in seiner Antwort geschrieben hat.

Unabhängig davon, was Sie tun, denken Sie daran, dass je weniger Code Sie schreiben, desto weniger Code Sie testen müssen, da die Komplexität Ihres Codes abnimmt.


1
Dank MapUtils.isEmpty ist die perfekte Lösung, um zu überprüfen, ob die Karte null oder leer ist
Narayan Yerrabachu

23
Schade, dass sie nicht genannt werden isNullOrEmpty.
Scadge

72

Das ist der beste Weg, um es zu überprüfen. Sie könnten eine Hilfsmethode schreiben, um dies zu tun:

public static boolean isNullOrEmpty( final Collection< ? > c ) {
    return c == null || c.isEmpty();
}

public static boolean isNullOrEmpty( final Map< ?, ? > m ) {
    return m == null || m.isEmpty();
}

Es muss auch eine ähnliche Funktion für geben Map<?>.
Luiggi Mendoza

1
Natürlich können Sie auch eine für Karten hinzufügen, aber der Titel gibt die Sammlung an.
icza

1
Ich verstehe nicht, wenn m null ist, dann wird .isEmpty () NullPointerException rigth verursachen? Andernfalls, wenn die linke Seite (m == null) wahr ist, wird der Rest nicht überprüft
Ismail Sahin

4
@ismail Der ||Operator ist ein Kurzschlussoperator. Wenn der linke Operand ist true, wird der rechte Operand nicht ausgewertet. Also wenn m == null, dann m.isEmpty()wird nicht aufgerufen (nicht benötigt, das Ergebnis ist true).
icza

fehlerfreie Lösung @icza
Gaurav

32

Wenn Sie Spring-Frameworks verwenden, können Sie CollectionUtilssowohl Sammlungen (Liste, Array) als auch Karte usw. überprüfen.

if(CollectionUtils.isEmpty(...)) {...}

Vielleicht sprechen Sie über MapUtils.isEmpty () für Map, aber nicht für alle Collection?
Pavlo Chechehov

21

Persönlich bevorzuge ich leere Sammlungen anstelle von nullund lasse die Algorithmen so arbeiten, dass es für den Algorithmus keine Rolle spielt, ob die Sammlung leer ist oder nicht.


10

Wenn Sie Feder verwenden, können Sie verwenden

boolean isNullOrEmpty = org.springframework.util.ObjectUtils.isEmpty(obj);

wo obj ist eine [Karte, Sammlung, Array, alles ...]

sonst: der Code ist:

public static boolean isEmpty(Object[] array) {
    return (array == null || array.length == 0);
}

public static boolean isEmpty(Object obj) {
    if (obj == null) {
        return true;
    }

    if (obj.getClass().isArray()) {
        return Array.getLength(obj) == 0;
    }
    if (obj instanceof CharSequence) {
        return ((CharSequence) obj).length() == 0;
    }
    if (obj instanceof Collection) {
        return ((Collection) obj).isEmpty();
    }
    if (obj instanceof Map) {
        return ((Map) obj).isEmpty();
    }

    // else
    return false;
}

für String am besten ist:

boolean isNullOrEmpty = (str==null || str.trim().isEmpty());

3

Wenn Sie nach null suchen müssen, ist dies der Weg. Wenn Sie dies jedoch kontrollieren können, geben Sie einfach die leere Sammlung zurück, wann immer Sie können, und prüfen Sie später nur, ob sie leer ist.

Dieser Thread ist ungefähr dasselbe mit C #, aber die Prinzipien gelten genauso gut für Java. Wie dort erwähnt, sollte null nur zurückgegeben werden, wenn

  • null könnte etwas Spezifischeres bedeuten;
  • Ihre API (Vertrag) könnte Sie zwingen, null zurückzugeben.

3

Sie können die org.apache.commons.lang.Validate" notEmpty " -Methode verwenden:

Validate.notEmpty(myCollection)-> Überprüfen Sie, ob die angegebene Argumentensammlung weder null noch eine Größe von null hat (keine Elemente). Andernfalls wird eine Ausnahme ausgelöst.


1

Wir prüfen, ob ein Collection-Objekt leer ist, null oder nicht. Diese alle unten angegebenen Methoden sind im Paket org.apache.commons.collections4.CollectionUtils enthalten.

Überprüfen Sie die Liste oder legen Sie den Typ der Sammlungsobjekte fest.

CollectionUtils.isEmpty(listObject);
CollectionUtils.isNotEmpty(listObject);

Überprüfen Sie den Kartentyp der Objekte.

MapUtils.isEmpty(mapObject);
MapUtils.isNotEmpty(mapObject);

Der Rückgabetyp aller Methoden ist boolesch.


-1

Verwenden Sie für alle Sammlungen einschließlich der Karte die isEmptyMethode, die für diese Sammlungsobjekte vorhanden ist. Sie müssen jedoch vorher eine Nullprüfung durchführen:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.