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.