Как проверить, не являются ли списки в списке пустыми?

У меня есть список списков в Java. Вот код:

List<List<Integer>> myList = new ArrayList<>();
myList.add(new ArrayList<Integer>());
myList.add(new ArrayList<Integer>());
myList.add(new ArrayList<Integer>());

myList.get(0).add(1);
myList.get(0).add(2);
myList.get(0).add(3);
myList.get(1).add(4);
myList.get(1).add(5);
myList.get(1).add(6);
myList.get(2).add(7);
myList.get(2).add(8);
myList.get(2).add(9);

Теперь в части моего кода я хочу проверить, не все ли три списка, которые находятся в myList, пустые и нулевые. Должен ли я проверять каждый из этих списков один за другим, вот так:

if (myList.get(0) != null && !myList.get(0).isEmpty()) { 
    // do something
} 

... или есть лучший и более короткий способ сделать, а не проверять один за другим?

Ответы

Ответ 1

Вы можете использовать Stream API для этого, но также и простой цикл:

 boolean allNonEmptyOrNull = myList.stream()
     .allMatch(x -> x != null && !x.isEmpty());

Или вы можете проверить, содержит ли null или пустой List например:

System.out.println(myList.contains(null) || myList.contains(Collections.<Integer> emptyList()));

Но этот последний вариант будет нарушен с неизменными коллекциями Java 9, например:

List.of(1, 2, 3).contains(null); 

будет NullPointerException.

Ответ 2

Использование Java 7 и ниже это классический подход к этому:

for (List<Integer> list : myList) {
    if (list != null && !list.isEmpty()) {
        // do something with not empty list
    }
}

С Java 8 и выше вы можете использовать forEach:

myList.forEach(list -> {
    if (list != null && !list.isEmpty()) {
        // do something with not empty list
    }
});

или, как уже упоминалось Eugene, с потоковым API вы можете заменить if statement на лямбда-выражение:

myList.stream()
      .filter(list -> (list != null && !list.isEmpty()))
      .forEach(list -> {
          // do something with not empty list
      });

Примечание. Все эти 3 примера подразумевают, что вы инициализировали переменную myList и не myList null, иначе NullPointerException будет myList во всех вышеперечисленных фрагментах.

Стандартный JDK не имеет быстрого способа проверить, что коллекция не является нулевой, а не пустой. Но если вы используете библиотеку commons-collections Apache, они предлагают такой метод: CollectionUtils.isNotEmpty(). Однако я бы не рекомендовал добавлять эту зависимость в ваш проект только ради этой единственной функции.

Ответ 3

Вы можете сделать что-то вроде этого:

boolean isEmpty = false;
for(List<Integer> list : myList) {
   if(list == null || list.isEmpty()) {
      isEmpty = true;
      break;
   }
}

if(!isEmpty) { // do your thing; }

Ответ 4

Просто проверьте, что ваша коллекция не содержит пустой список

if (!L.contains(Collections.EMPTY_LIST)){ do something }

или пустая и нулевая проверка (будьте осторожны с NullPointerException !!!)

if (!L.contains(Collections.EMPTY_LIST) && !L.contains(null)){ do something }

Ответ 5

int temp = 0;
for(int i=0;i<L.size();i++) {
    if (L.get(i).isEmpty()) {
        temp++;
    }
}
if (temp == L.size()) {
   //do what you want, all the lists inside L are empty
}

Это все, о чем я могу думать сейчас.

Ответ 6

Я бы использовал цикл Java foreach. Он похож на цикл по индексу, но читается лучше и немного короче.

boolean nonempty = true;

for (List<Integer> list : myList) {
    if (list == null || list.isEmpty()) {
        nonempty = false;
        break;
    }
}

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

Ответ 7

Я хочу проверить, не все ли три списка, которые находятся в списке

myList.stream().anyMatch(List::isEmpty);

Это должно дать вам результат, если какой-либо внутренний список пуст или нет. Исходя из вашего требования, вы можете его отменить.
Но если вам нужно также проверить значение null, вы можете попробовать что-то,

myList.stream().anyMatch(i -> null==i || i.isEmpty())

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