如何检查列表中的列表是否不为空?

时间:2018-10-11 20:52:12

标签: java list

我有一个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
} 

...还是有更好,更短的方法来代替逐个检查?

7 个答案:

答案 0 :(得分:20)

您可以为此使用流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

答案 1 :(得分:9)

使用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
    }
});

,或者已经mentioned by Eugene,使用流API,您可以将if语句替换为lambda-expression:

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

注意:所有这3个示例都暗示您已初始化myList变量,而不是null,否则,NullPointerException会抛出在上面的所有代码片段中。

标准JDK没有快速的方法来检查集合不是null也不为空。但是,如果您使用的是Apache commons-collections库,则它们提供了这样一种方法:CollectionUtils.isNotEmpty()。但是,我不建议仅出于此单一功能而将此依赖项添加到您的项目中。

答案 2 :(得分:6)

您可以执行以下操作:

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

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

答案 3 :(得分:5)

只需检查您的收藏夹中是否包含空列表

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

或为空和空检查(请注意NullPointerException !!!)

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

答案 4 :(得分:3)

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
}

这就是我现在能想到的。

答案 5 :(得分:2)

我将使用Java foreach循环。它类似于按索引循环,但读起来更好,并且更短。

boolean nonempty = true;

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

如果发现一个空列表,这也可以让您尽早突破。

答案 6 :(得分:-1)

  

我要检查列表中的所有三个列表是否都不为空

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

如果任何内部列表为空,这应该为您提供输出。 根据您的要求,您可以取消它。
但是,如果您还需要检查null,则可以尝试使用

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

同样,您可以根据需要取反。 该答案是为上述答案添加变体。