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

2022-09-02 19:26:52

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

您可以使用流 API 来实现此目的,也可以使用普通循环:

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

或者,您可以检查是否包含或为空,例如,通过以下方式:nullList

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,你可以用 lambda 表达式替换语句:if

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

注意:所有这3个例子都暗示你已经初始化了变量,它不是,否则将在上面的所有片段中抛出。myListnullNullPointerException

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