Лучшая практика для проверки пустой и пустой коллекции в Java


211

Я хочу , чтобы проверить , пуст ли коллекция и 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.
远 声 远 Shengyuan Лу

@JonSkeet люди используют null == sampleMap, если они пишут = вместо ==. если вы используете sampleMap == null, когда вы забываете одно =, оно становится sampleMap = null, что не приведет к возникновению ошибки, поэтому ее запись другим способом помогает разработчику увидеть это
Uri

1
@UriLoya: Если вы пишете if (null = sampleMap)на Java, вы получите ошибку компиляции. Именно в этом смысл моего первого комментария. «Причина» этого зависит от языка, но была распространена на другие языки, несмотря на снижение читабельности, потому что люди не думали, почему они это делают.
Джон Скит

Вы можете использовать класс CollectionUtils, который присутствует в пакете org.apache.commons.collections4.CollectionUtils. Есть много служебных методов для поиска пустых или нулевых.
Викаш

Ответы:


313

Если вы используете Apache Commons Коллекции библиотеки в вашем проекте, вы можете использовать CollectionUtils.isEmptyи MapUtils.isEmpty()методы , которые , соответственно , проверить , если коллекция или карта пуста или нулевой (т.е. они являются «нуль-сейф»).

Код этих методов более или менее написан пользователем @icza в своем ответе.

Независимо от того, что вы делаете, помните, что чем меньше кода вы пишете, тем меньше кода вам нужно тестировать, так как уменьшается сложность кода.


1
Спасибо MapUtils.isEmpty - отличное решение для проверки того, что карта пуста или нет
Нараян Еррабачу

23
Жаль, что они не названы isNullOrEmpty.
Scadge

73

Это лучший способ проверить это. Вы можете написать вспомогательный метод для этого:

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 Rigth? в противном случае, если левая сторона (m == null) верна, то остальные не будут проверены
Исмаил Сахин

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

безупречное решение @icza
gaurav

32

Если вы используете Spring Framework, вы можете использовать его 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;
}

для строки лучше всего:

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

3

Если вам нужно проверить на ноль, это путь. Однако, если у вас есть контроль над этим, просто возвращайте пустую коллекцию, когда это возможно, и проверяйте только на пустое позже.

Этот поток примерно такой же, как в C #, но принципы в равной степени применимы и к Java. Как упомянуто там, нуль должен быть возвращен, только если

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

3

Вы можете использовать org.apache.commons.lang.Validate«s„ notEmpty метод“:

Validate.notEmpty(myCollection)-> Проверить, что указанная коллекция аргументов не имеет ни нулевого, ни нулевого размера (без элементов); в противном случае выбрасывать исключение.


1

Мы проверим, является ли объект Collection пустым, нулевым или нет. все эти методы, которые приведены ниже, присутствуют в пакете 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.