如何检查列表内的对象是否为空或空

时间:2018-09-28 12:13:30

标签: java list collections

我有一个类似List<List<UsersDetails>> userList的东西,如果我调试查看它的值,就会得到[[]],即List<UsersDetails>为空,List<List<UsersDetails>>也为空,有没有办法检查List<UsersDetails>是否为空而不进行迭代。

我尝试了userList.sizeOfuserList.empty()函数和userList==null运算符,但都给出了错误的结果。

3 个答案:

答案 0 :(得分:1)

如果要检查“外部”列表中的每个元素,则必须以某种方式对其进行迭代。但是,Java 8的流将向您隐藏此内容,并提供了更简洁的语法:

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

答案 1 :(得分:0)

没有。有:

if (userList.isEmpty() || userList.get(0).isEmpty()) { ... }

但是大多数情况下,如果使用以下概念:“这是一个列表列表,其中列表列表包含1个列表,但是该列表为空”,则应将其视为“空”,这是因为您使用了错误的数据结构。您尚未解释使用此List<List<UsersDetails>>建模的内容,但是如果您对此进行了详细说明,则java。*中的其他数据类型或guava可能更合适。例如,在这里Map<Integer, UsersDetail>可能是更好的匹配项(将用户的ID映射到他们的详细信息)。

答案 2 :(得分: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使用流提供的答案是最有利的。