我有一个类似List<List<UsersDetails>> userList
的东西,如果我调试查看它的值,就会得到[[]]
,即List<UsersDetails>
为空,List<List<UsersDetails>>
也为空,有没有办法检查List<UsersDetails>
是否为空而不进行迭代。
我尝试了userList.sizeOf
,userList.empty()
函数和userList==null
运算符,但都给出了错误的结果。
答案 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使用流提供的答案是最有利的。