Najlepsza praktyka sprawdzania poprawności pustej i pustej kolekcji w Javie

209

Chcę sprawdzić, czy kolekcja jest pusta i null. Czy ktoś mógłby dać mi znać najlepszą praktykę.

Obecnie sprawdzam jak poniżej:

if (null == sampleMap || sampleMap.isEmpty()) {
  // do something
} 
else {
  // do something else
}
użytkownik1635014
źródło
10
Pomijając wszystko inne, zastanów się, dlaczego używasz, null == sampleMapa nie sampleMap == null. Większość ludzi uważa, że ​​ten drugi jest bardziej czytelny - ten pierwszy jest pozostałością po innych językach.
Jon Skeet
6
Nawiasem mówiąc, kolekcja zerowa jest zła. Jeśli to możliwe, zamiast tego należy opróżnić kolekcję. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
远 声 远 Shengyuan Lu
@JonSkeet ludzie używają null == sampleMap w przypadku, gdy piszą = zamiast ==. jeśli użyjesz sampleMap == null, kiedy zapomnisz jeden =, staje się sampleMap = null, co nie spowoduje błędu, więc zapisanie go w inny sposób pomaga programistom to zobaczyć
Uri Loya,
1
@UriLoya: Jeśli piszesz if (null = sampleMap)w Javie, pojawi się błąd kompilacji. Właśnie o to chodzi w moim pierwszym komentarzu. „Powód” jest specyficzny dla danego języka, ale został rozpowszechniony na inne języki pomimo kary za czytelność, ponieważ ludzie nie zastanawiali się, dlaczego to robią.
Jon Skeet
Możesz użyć klasy CollectionUtils, która jest obecna w pakiecie org.apache.commons.collections4.CollectionUtils. Istnieje wiele metod służących do znajdowania pustych lub pustych.
Vikash

Odpowiedzi:

312

Jeśli używasz biblioteki Apache Commons Kolekcje w swoim projekcie, możesz użyć metod CollectionUtils.isEmptyi MapUtils.isEmpty(), które odpowiednio sprawdzają, czy kolekcja lub mapa jest pusta, czy pusta (tzn. Czy są „zerowo bezpieczne”).

Kod tych metod jest mniej więcej tym, co napisał użytkownik @icza w swojej odpowiedzi.

Niezależnie od tego, co robisz, pamiętaj, że im mniej kodu piszesz, tym mniej kodu musisz przetestować, ponieważ złożoność kodu maleje.

Jalayn
źródło
1
Dzięki MapUtils.isEmpty to idealne rozwiązanie, aby sprawdzić, czy mapa jest pusta lub pusta
Narayan Yerrabachu
23
Szkoda, że ​​nie są nazwani isNullOrEmpty.
Scadge
72

To najlepszy sposób, aby to sprawdzić. Możesz napisać metodę pomocniczą, aby to zrobić:

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

public static boolean isNullOrEmpty( final Map< ?, ? > m ) {
    return m == null || m.isEmpty();
}
icza
źródło
Musi również istnieć podobna funkcja Map<?>.
Luiggi Mendoza
1
Jasne, możesz dodać jeden do map, ale tytuł podał kolekcję.
icza
1
Nie rozumiem, jeśli m ma wartość null, to .isEmpty () spowoduje rygor NullPointerException? w przeciwnym razie, jeśli lewa strona (m == null) jest prawdziwa, to pozostałe nie zostaną sprawdzone
Ismail Sahin
4
@ismail ||Operator jest operatorem zwarciowym, co oznacza, że ​​jeśli lewy operand jest true, nie oceni właściwego operandu. Więc jeśli m == null, to m.isEmpty()nie zostanie wywołany (niepotrzebny, wynik jest true).
icza
bezbłędne rozwiązanie @icza
gaurav
32

Jeśli używasz ram Spring, możesz użyć CollectionUtilsdo sprawdzenia zarówno kolekcji (lista, tablica), jak i mapy itp.

if(CollectionUtils.isEmpty(...)) {...}
Saorikido
źródło
może mówisz o MapUtils.isEmpty () dla Map, ale nie dla wszystkich kolekcji?
Pavlo Chechehov
21

Osobiście wolę używać pustych kolekcji zamiast nulli mieć algorytmy działające w taki sposób, że dla algorytmu nie ma znaczenia, czy kolekcja jest pusta, czy nie.

tehlexx
źródło
10

Kiedy używasz wiosny, możesz użyć

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

gdzie obj to dowolna [mapa, kolekcja, tablica, wszystko ...]

w przeciwnym razie: kod to:

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

dla String najlepiej jest:

boolean isNullOrEmpty = (str==null || str.trim().isEmpty());
Dharmendrasinh Chudasama
źródło
3

Jeśli chcesz sprawdzić wartość null, to jest właśnie ten sposób. Jeśli jednak masz nad tym kontrolę, po prostu zwróć pustą kolekcję, kiedy tylko możesz, i sprawdź tylko później, czy jest pusta.

Wątek ten dotyczy mniej więcej tego samego języka C #, ale zasady dotyczą równie dobrze Java. Jak wspomniano powyżej, wartość null powinna zostać zwrócona tylko wtedy, gdy

  • null może oznaczać coś bardziej szczegółowego;
  • Twój interfejs API (umowa) może zmusić Cię do zwrócenia wartości null.
eis
źródło
3

Możesz użyć metody org.apache.commons.lang.ValidatenotEmpty ”:

Validate.notEmpty(myCollection)-> Sprawdź, czy podana kolekcja argumentów nie ma wartości null ani nie ma wartości zero (brak elementów); w przeciwnym razie zgłasza wyjątek.

Maria Ines Parnisari
źródło
1

Sprawdzimy, czy obiekt Collection jest pusty, zerowy lub nie. wszystkie te metody podane poniżej znajdują się w pakiecie org.apache.commons.collections4.CollectionUtils.

Sprawdź na liście lub ustaw typ kolekcji obiektów.

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

Sprawdź typ obiektów na mapie.

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

Zwrócony typ wszystkich metod ma wartość logiczną.

Vikash
źródło
-1

Dla wszystkich kolekcji, w tym mapy użyj: isEmptymetody, która znajduje się na tych obiektach kolekcji. Ale musisz zrobić kontrolę zerową przed:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Nisar Adappadathil
źródło