如何从列表中删除空列表(Java)

12

我搜索过,但是找到的都是用Python或R等其他语言的方法。

我有一个包含列表的列表,希望删除空列表。 例如:

  

[[abc,def],[ghi],[],[],[jkl,mno]]

我想要的结果是:

  

[[abc,def],[ghi],[jkl,mno]]

如何从列表中删除空列表? 谢谢!


1
我会尝试使用 list.removeAll(new ArrayList()); - Kon
@Kon 不,它没有起作用。 - sw2
为什么null或""能匹配空列表?你似乎对这里的情况有一个非常奇怪和错误的想法。 - Reinstate Monica
3个回答

27

你也可以尝试这个:

list.removeIf(p -> p.isEmpty());

4
这比被接受的答案要好得多,意图更加明显。 - BlueRaja - Danny Pflughoeft
3
然而,如果您拥有此[https://dev59.com/VV0Z5IYBdhLWcg3wrB2H#31196977],该答案将返回一个NullPointerException错误。 - Andrei
2
也可以这样写:list.removeIf(List::isEmpty); - Lii

12

你可以使用:

list.removeAll(Collections.singleton(new ArrayList<>()));

8
你能详细解释一下那里正在发生什么吗? - Andrei
2
.removeAll(Collections.singleton(Collections.emptyList()) - blgt

11
list.removeAll(Collections.singleton(new ArrayList<>()));

上面的代码对许多情况都有效,但它依赖于列表中 equals 方法的实现,因此如果你有类似下面的代码,它将会失败。

public class AnotherList extends ArrayList<String> {
    @Override
    public boolean equals(Object o) {
        return o instanceof AnotherList && super.equals(o);
    }
}

List<List<String>> list = new ArrayList<>();
list.add(Arrays.asList("abc", "def"));
list.add(Arrays.asList("ghi"));
list.add(new ArrayList<String>());
list.add(new ArrayList<String>());
list.add(new AnotherList());
list.add(null);
list.add(Arrays.asList("jkl", "mno"));

一个解决方案是:

list.removeIf(x -> x != null && x.isEmpty());

如果你不担心equals方法的不同实现,那么你可以使用另一种解决方案。


2
java.util.List的契约实际上指定了equals的精确行为,以保证不会发生此问题。 当然,编译器无法强制执行这个契约的这个方面; 尽管如此,您示例中的问题在于AnotherList违反了里氏替换原则。 应该修复该缺陷,而不是绕过它; 如果失败,则不应在期望ListArrayList时使用它的实例。 - ruakh

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