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


102

Я бачу, що у Guava використовується метод isNullOrEmpty для Strings

Strings.isNullOrEmpty(str)

Чи є у нас щось подібне до списків? Щось на зразок

Lists.isNullOrEmpty(list)

що має бути рівнозначним

list == null || list.isEmpty()

Також, чи є у нас щось подібне для Arrays? Щось на зразок

Arrays.isNullOrEmpty(arr)

що має бути рівнозначним

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

Відповіді:


141

Ні, цього методу не існує в Гуаві і насправді є нашим "кладовищем ідеї".

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

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

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вас кинуть, і зробіть цей абонент формувати.


7
Що робити, якщо якийсь фреймворк встановлює це поле на нуль, і ви не можете його контролювати (весняна рамка, коли прив'язується до списку), хоча ви явно встановлюєте та використовуєте порожній список в об'єкті.
OMax

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

8
(або пропустіть помічника і просто напишіть if (collection == null || collection.isEmpty())у тих випадках, коли вам це потрібно! Це так погано?)
Кевін Бурліон

13
Це впевнена відповідь, яка насправді взагалі не стосується цього питання. Це також суперечить принципам оборонного програмування.
Неовібрант

11
@Neovibrant, оскільки питання стосується можливостей бібліотеки Guava, а відповідь - від провідного розробника Guava, відповідь начебто має на увазі: "Ні, у Guava цього немає". Відповідь, можливо, буде покращена, почавши з цього твердження :)
Grundlefleck

37

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

Якщо ви хочете використовувати парадигму Гуави, подумайте, чи справді джерело цієї колекції (або масиву) потрібно додатково повернути null. Якщо ні, подумайте про це @NonNullі поверніть порожні колекції замість null. Або, як параметр функції, яка очікує nullнецільових списків, розглянемо використання Preconditions.checkNotNull, яке видає виняток, якщо a null(несподівано) передано в.

Якщо це nullдійсно законно, list == null || list.isEmpty()це не так складно.


9
це непослідовно. Такий же аргумент можна зробити і для Strings, але є Strings.isNullOrEmpty ()
Дон Чейдл

29

1
На жаль, її, здається, видалено в останніх версіях. Див. Org.apache.commons.collections15.CollectionUtils.
spaaarky21

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

1
CollectionUtils.isEmpty () корисний при роботі зі застарілими програмами, коли ви не можете змінити передній код.
Джером Далберт

1
ми це знаємо, але хтось запитував про гуаву, а не про апаші.
До Кра

9

Spring Framework має спеціалізований клас утилітів під назвою CollectionUtils. І метод , який ви шукаєте: org.springframework.util.CollectionUtils.isEmpty. Він повертає істину для нульових та порожніх колекцій.

А для масивів існує org.springframework.util.ObjectUtils.isEmptyметод, який веде себе майже однаково.


5
Хоча це, мабуть, безпечно використовувати, цей клас позначений коментарем "Головним чином для внутрішнього використання в рамках". Це означає, що його інтерфейс може змінитися під час оновлення Spring, і вам доведеться виконати додаткову роботу, щоб знову працювати.
Майк Мініцький

2

Apache CollectionUtils 4 має метод CollectionUtils.emptyIfNull (), який повертає порожній список, якщо колекція є нульовою. Це дуже корисно в циклі foreach, тому вам не потрібно робити нульову перевірку перед ітерацією


1

Моє рішення: MoreObjects.firstNonNull (список, колекції. 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 inNotEmpty ...
До

Довідковий центр> Привілеї> Відмовитися від голосування Коли я повинен голосувати? Використовуйте свої голоси, коли ви стикаєтеся з надзвичайно неохайною публікацією, яка не витрачає зусиль, або відповіді, яка явно і може бути небезпечно неправильною. Ви маєте обмежену кількість голосів на день, і відповідь на зменшення голосу вартує вам трохи репутації; використовуйте їх розумно. stackoverflow.com/help/privileges/vote-down
jeton

Чи вважаєте ви, що моя відповідь - "надзвичайно неохайний пост, не витрачений на зусилля, чи відповідь, яка явно і, можливо, небезпечно невірна"? Якщо ні, то чому ви негативно голосуєте?
jeton

0

Подивіться на Appache Collections CollectionUtils.isEmpty () повертає значення true, якщо колекція є нульовою або порожньою

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