Google Guava isNullOrEmpty для коллекций


102

Я вижу, что у Guava есть служебный метод isNullOrEmpty для строк

Strings.isNullOrEmpty(str)

Есть ли у нас что-нибудь подобное для списков? Что-то вроде

Lists.isNullOrEmpty(list)

что должно быть эквивалентно

list == null || list.isEmpty()

Кроме того, есть ли у нас что-нибудь подобное для массивов? Что-то вроде

Arrays.isNullOrEmpty(arr)

что должно быть эквивалентно

arr == null || arr.length == 0

Ответы:


141

Нет, этого метода не существует в Гуаве, и он фактически находится на нашем «кладбище идей».

Мы не верим, что «пусто или пусто» - это вопрос, который вы действительно хотите задать о коллекции.

Если коллекция может иметь значение NULL, а значение NULL следует рассматривать как пустое, устраните всю эту двусмысленность заранее, например:

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

или вот так (если хотите):

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

После этого вы можете использовать .isEmpty()как обычно. Сделайте это сразу после вызова непослушного API, и вы оставите странности позади, вместо того, чтобы позволять этому продолжаться бесконечно.

И если «null, что на самом деле означает пустую коллекцию» не возвращается вам, а передается вам, ваша работа проста: просто позвольте NullPointerExceptionбросить a и заставить этого вызывающего абонента сформироваться.


7
Что делать, если какой-то фреймворк устанавливает для него значение null, и вы не можете его контролировать (фреймворк Spring при привязке к списку), хотя вы явно устанавливаете и используете пустой список в объекте.
— OMax

15
Мой ответ тот же: постарайтесь nullкак можно скорее устранить двусмысленность путем нормализации до пустой коллекции. Если вы просто не можете, тогда ладно, вы можете быть одним из <1% пользователей, которые действительно хотят написать свой собственный тривиальный помощник isNullOrEmpty (Collection).
— Кевин Бурриллион,

8
(или пропустите помощника и просто напишите if (collection == null || collection.isEmpty())в тех случаях, когда он вам нужен! Разве это так плохо?)
— Кевин Бурриллион

13
Это самоуверенный ответ, который на самом деле вообще не отвечает на вопрос. Это также противоречит принципам защитного программирования.
— Neovibrant

11
@Neovibrant, поскольку вопрос касается возможностей библиотеки Guava, а ответ от одного из ведущих разработчиков Guava, ответ подразумевается: «Нет, у Guava этого нет». Ответ можно улучшить, начав с этого утверждения :)
— Grundlefleck

37

Одна вещь, которую вы, как правило, найдете в Guava, - это то, что они очень враждебны по отношению к nulls. Авторы хотят отговорить вас использовать nullстолько, сколько вы, вероятно, делаете, и предоставление служебных методов, облегчающих использование null, будет контрпродуктивным с этой целью.

Если вы хотите использовать парадигму Guava, подумайте, действительно ли источник этой коллекции (или массива) должен при желании возвращаться null. Если нет, подумайте о том, чтобы пометить его @NonNullи вернуть пустые коллекции вместо null. Или в качестве параметра функции, которая ожидает nullбеззначные списки, рассмотрите возможность использования Preconditions.checkNotNull, которая выдает исключение, если null(неожиданно) передается.

Если nullдействительно законно, list == null || list.isEmpty()не так уж и сложно.


9
это непоследовательно. Тот же аргумент может быть сделано для струнных, но там есть Strings.isNullOrEmpty ()
— Дон Чидл

29

В общих коллекциях есть CollectionUtils.isEmpty () .


1
К сожалению, похоже, что в более поздних версиях он был удален. См. Org.apache.commons.collections15.CollectionUtils.
— spaaarky21

1
Если посмотреть на Javadoc из apache.commons.collection, методы isEmpty () и isNotEmpty () все еще существуют в последней версии. collection15.CollectionUtils выглядит как независимый проект, пытающийся обеспечить общую поддержку.
— proko

1
CollectionUtils.isEmpty () полезен при работе с устаревшими приложениями, когда вы не можете изменить исходный код.
— Джером Далберт

1
мы это знаем, но кто-то спрашивал о гуаве, а не о Apache Commons.
— To Kra

9

Spring Framework имеет специализированный класс утилиты, называемый CollectionUtils. И метод , который вы ищете: org.springframework.util.CollectionUtils.isEmpty. Он возвращает true для пустых и пустых коллекций.

А для массивов есть org.springframework.util.ObjectUtils.isEmptyметод, который ведет себя примерно так же.


5
Хотя использовать его, вероятно, безопасно, этот класс отмечен комментарием «В основном для внутреннего использования в рамках». Это означает, что его интерфейс может измениться при обновлении Spring, и вам придется проделать дополнительную работу, чтобы он снова заработал.
— Майк Миники

2

В Apache CollectionUtils 4 есть метод CollectionUtils.emptyIfNull (), который возвращает пустой список, если коллекция равна нулю. Это очень полезно в цикле foreach, поэтому вам не нужно выполнять нулевую проверку перед повторением.


1

Мое решение: MoreObjects.firstNonNull (list, Collections. EmptyList ())

Я использую Guava MoreObjects с коллекциями JDK.

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

1
Это именно то, что предлагается в верхнем ответе , за исключением того, что вы не используете ImmutableList.
— dimo414

Я думаю отрицательно, потому что нужно было простое и быстрое решение, такое как методы apache commons в NotEmpty ...
— К Kra

Справочный центр> Привилегии> Голосовать против Когда мне следует проголосовать против? Используйте свои отрицательные голоса всякий раз, когда вы сталкиваетесь с вопиюще небрежным постом, не требующим усилий, или с ответом, который является явно и, возможно, опасно неверным. У вас есть ограниченное количество голосов в день, и ответ на голосование "против", помимо этого, стоит вам крошечной репутации; используйте их с умом. stackoverflow.com/help/privileges/vote-down
— jeton

Как вы думаете, мой ответ - «вопиюще небрежный, не требующий усилий пост, или ответ, который явно и, возможно, опасно неверен»? Если нет, то почему вы голосуете против?
— jeton

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.