如何检查列表中的对象是否为空或null?

4
我有一个类似于List<List<UsersDetails>> userList的东西。如果我调试查看它的值,它会给出[[]],即List<UsersDetails>为空,List<List<UsersDetails>>也为空。有没有一种方法可以在不迭代的情况下检查List<UsersDetails>是否为空?
我尝试使用userList.sizeOfuserList.empty()函数以及userList==null操作符,但都返回false。

4
纠正:如果输出是 [[]],那么 userList 不为空。它包含一个元素,恰好是一个空列表。那么对于 [[], []](即包含两个空列表的列表),你想如何处理?它应该被视为一个空列表还是一个包含空列表的列表? - Joachim Sauer
1
如果以下任何一个答案解决了您的问题,您应该接受它(单击适当答案旁边的复选标记)。这样做有两个作用。它让每个人都知道您的问题已经得到满意的解决,并且它为帮助您的人提供了帮助的信用。请参见此处的完整说明。 - dpr
3个回答

2

如果你想检查“外部”列表中的每个元素,你需要以某种方式迭代它。然而,Java 8的流会将这个过程隐藏起来,并提供稍微更清晰的语法:

boolean allEmpty = userList.stream().allMatch(l -> l == null || l.empty());

问题中没有指定“迭代”。 - drowny

2
没有。有以下内容:
if (userList.isEmpty() || userList.get(0).isEmpty()) { ... }

但是,如果你认为“这是一个包含一个空列表的列表”的概念应该被视为“空”,那么你正在使用错误的数据结构。你没有解释你用List<List<UsersDetails>>来模拟什么,但也许如果你对此进行详细说明,Java或者Guava库中的其他数据类型可能更加适合。例如,也许在这里使用Map<Integer, UsersDetail> 更加合适(将用户ID映射到他们的详细信息)。


你将两个列表添加到了一个列表中。第一个列表是空的,但另一个列表是非空的。在这种情况下,它会失败。 - drowny

0
你可以创建自己的 List,它简单地委托给例如 ArrayList,但防止添加 null 或空列表:
public class NonEmptyUserList implements List<List<UserDetails>>{

  private ArrayList<List<String>> mDelegate = new ArrayList<>();

  public void add(int index, List<UserDetails> element) {
    if (element == null || element.isEmpty()) {
      return;
    }

    mDelegate.add(index, element);
  }

  public boolean add(List<UserDetails> element) {
    if (element == null || element.isEmpty()) {
      return false;
    }

    return mDelegate.add(e);
  }

  public List<UserDetails> set(int index, List<UserDetails> element) {
    if (element == null || element.isEmpty()) {
      return null;
    }

    return mDelegate.set(index, element);
  }

  public boolean addAll(Collection<? extends List<UserDetails>> c) {
    boolean changed = false;
    for (final List<String> list : c) {
        changed = changed || add(list);
    }
    return changed;
  }

  public boolean addAll(int index, Collection<? extends List<UserDetails>> c) {
    boolean changed = false;
    int startIndex = index;
    for (final List<String> list : c) {
        add(startIndex, list);
        changed = changed || (list != null) && !list.isEmpty();
        startIndex++;
    }

    return changed;
  }

  // delegate all other methods required by `List` to mDelegate
}

使用此列表,您可以确保不存在null或空值,因此您可以使用:

NonEmptyUserList userList = new NonEmptyUserList();
userList.add(null);
userList.add(Collections.emptyList());
userList.isEmpty(); // returns true

List<UserDetails> subList = new ArrayList<>();
subList.add(null);

userList.add(subList);
userList.isEmpty(); // returns false

如果你想要处理只包含null元素的子列表为空的情况,你需要扩展上述实现。然而,这是我目前能想到的唯一解决方案,它不涉及迭代列表的元素。但我并不真正推荐这个解决方案。我只是写下来给你看看可能的情况。

我个人认为@Mureinik提供的使用流的答案最可取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接