Как проверить, не являются ли списки в списке пустыми?
У меня есть список списков в 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())
Снова вы можете отменить, как требуется. Этот ответ заключается в том, чтобы добавить вариант к вышеупомянутым ответам.