Найкраща практика для перевірки нульової та порожньої колекції на Java


209

Я хочу перевірити, чи колекція порожня і null. Чи не будь-хто, будь ласка, дайте мені знати найкращу практику.

На даний момент я перевіряю, як показано нижче:

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

10
Крім усього іншого, подумайте, чому ви використовуєте, null == sampleMapа не чим sampleMap == null. Більшість людей вважають останнє більш читабельним - перший є перекладом з інших мов.
Джон Скіт

6
До речі, нульовий збір поганий. Якщо можливо, замість цього зробіть порожню колекцію. See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
卢 声 远 Шеньюань Лу

@JonSkeet люди використовують null == sampleMap, якщо вони пишуть = замість ==. якщо ви використовуєте sampleMap == null, коли ви забудете один =, він стає sampleMap = null, що не призведе до помилки, таким чином, записуючи його іншим способом, допомагає розробнику побачити це
Урі Лоя

1
@UriLoya: Якщо ви пишете if (null = sampleMap)на Java, ви отримаєте помилку компіляції. Саме в цьому і полягає мій перший коментар. "Причина" цього є специфічною для мови, але вона поширюється на інші мови, незважаючи на покарання для читабельності, тому що люди не розглядали, чому це роблять.
Джон Скіт

Ви можете використовувати клас CollectionUtils, який присутній у пакунку org.apache.commons.collections4.CollectionUtils. Існує безліч корисних методів пошуку порожніх або нульових.
vikash

Відповіді:


312

Якщо ви використовуєте бібліотеку колекцій Apache Commons у своєму проекті, ви можете використовувати методи CollectionUtils.isEmptyта MapUtils.isEmpty()методи, які відповідно перевіряють, чи колекція чи карта порожні чи недійсні (тобто вони "безпечні для нуля").

Код, що стоїть за цими методами, є більш-менш тим, що написав користувач @icza у своїй відповіді.

Незалежно від того, що ви робите, пам’ятайте, що чим менше ви пишете коду, тим менше коду потрібно перевірити, оскільки складність вашого коду зменшується.


1
Дякую MapUtils.isEmpty - ідеальне рішення, щоб перевірити, чи карта нульова чи порожня
Narayan Yerrabachu

23
Шкода, що вони не названі isNullOrEmpty.
Скад

72

Це найкращий спосіб перевірити це. Ви можете написати метод помічника, щоб це зробити:

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

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

Має бути подібна функція і для Map<?>.
Луїджі Мендоса

1
Звичайно, ви можете додати і для карт, але в назві вказана колекція.
icza

1
Я не розумію, якщо m є нульовим, то .isEmpty () спричинить NullPointerException сутості? в іншому випадку, якщо ліва сторона (m == null) вірна, то решта не буде перевірена
Ісмаїл Сахін

4
@ismail ||Оператор є оператором короткого замикання, тобто якщо лівий операнд true, він не буде оцінювати правий операнд. Так що, якщо m == nullтоді m.isEmpty()не буде викликано (не потрібно, результат є true).
icza

бездоганний розчин @icza
gaurav

32

Якщо ви використовуєте весняні фреймворки, ви можете CollectionUtilsперевірити їх як у колекціях (список, масив), так і у карті тощо.

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

можливо, ви говорите про MapUtils.isEmpty () для Map, але не для всієї колекції?
Павло Чечехов

21

Особисто я вважаю за краще використовувати порожні колекції замість, nullа алгоритми працюють так, що для алгоритму не має значення, чи колекція порожня чи ні.


10

Коли ви використовуєте весну, то можете використовувати

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

де obj - будь-який [карта, колекція, масив, нічого ...]

інакше: код:

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

для String кращим є:

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

3

Якщо вам потрібно перевірити наявність нуля, це шлях. Однак якщо у вас є контроль над цим, просто повертайте порожню колекцію, коли тільки зможете, і перевірте лише чи порожню згодом.

Ця нитка приблизно однакова з C #, але принципи однаково добре застосовуються до Java. Як і згадувалося там, null повинен бути повернутий лише якщо

  • null може означати щось більш конкретне;
  • ваш API (контракт) може змусити вас повернути нуль.

3

Ви можете використовувати метод org.apache.commons.lang.Validate" notEmpty ":

Validate.notEmpty(myCollection)-> підтвердити, що вказаний збірник аргументів не є ні нульовим, ні розміром нуля (немає елементів); інакше кидати виняток.


1

Ми перевіримо, чи об’єкт колекції порожній, нульовий чи ні. всі ці методи, які наведені нижче, присутні у пакеті org.apache.commons.collections4.CollectionUtils.

Перевірте у списку або встановіть тип об’єктів колекції.

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

Перевірте тип об’єктів на карті.

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

Тип повернення всіх методів булевий.


-1

Для всіх колекцій, включаючи використання карт: isEmptyметод, який є на цих об'єктах колекції. Але ви повинні зробити нульову перевірку раніше:

Map<String, String> map;

........
if(map!=null && !map.isEmpty())
......
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.