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

hel*_*len 18 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);
Run Code Online (Sandbox Code Playgroud)

现在在我的代码的一部分中,我想检查位于的所有三个列表是否为myList空并且为空.我应该逐个检查这些列表中的每一个,如下所示:

if (myList.get(0) != null && !myList.get(0).isEmpty()) { 
    // do something
} 
Run Code Online (Sandbox Code Playgroud)

......还是有更好更短的方法而不是一个一个地检查?

Eug*_*ene 21

您可以为此使用流API,也可以使用普通循环:

 boolean allNonEmptyOrNull = myList.stream()
     .allMatch(x -> x != null && !x.isEmpty());
Run Code Online (Sandbox Code Playgroud)

或者您可以检查是否null包含或者为空List,例如:

System.out.println(myList.contains(null) || myList.contains(Collections.<Integer> emptyList()));
Run Code Online (Sandbox Code Playgroud)

但是最后一个选项将打破Java 9不可变集合,例如:

List.of(1, 2, 3).contains(null); 
Run Code Online (Sandbox Code Playgroud)

会抛出一个NullPointerException.

  • 这非常令人惊讶.如果你问我,可怕的设计决定. (9认同)

Vla*_* L. 9

使用Java 7及更低版本,这是接近它的经典方法:

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

使用Java 8及更高版本,您可以使用forEach:

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

或者,正如Eugene已经提到的,使用流API,您可以if使用lambda-expression 替换语句:

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

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

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


Pri*_*jee 6

你可以这样做:

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

if(!isEmpty) { // do your thing; }
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 5

只检查您的收藏不包含空列表

if (!L.contains(Collections.EMPTY_LIST)){ do something }
Run Code Online (Sandbox Code Playgroud)

或者空和空检查(小心NullPointerException !!!)

if (!L.contains(Collections.EMPTY_LIST) && !L.contains(null)){ do something }
Run Code Online (Sandbox Code Playgroud)