从列表中删除null元素

时间:2011-12-19 09:23:01

标签: java

List<String> list = new ArrayList<String>();
  list.add("One");
  list.add(null);
  list.add("Two!");
  list.add(null);
  list.add("Three");
  list.add(null);
  list.add("Four");
  list.add(null);

我有一个包含 null 元素的列表。有没有办法在不使用任何迭代的情况下从当前集合中删除 null 元素?

9 个答案:

答案 0 :(得分:50)

这应该有效:

list.removeAll(Collections.singleton(null));  

答案 1 :(得分:8)

在java 8中,您可以使用Collection.removeIf

list.removeIf(Objects::isNull);

答案 2 :(得分:5)

扩展ArrayList并覆盖add()&amp; addAll()方法只是不允许null

或者您可以使用list.removeAll(null);,如here 内部迭代循环

答案 3 :(得分:3)

看看LambdaJ,它允许你“无”循环操作集合。实际上循环是在库中实现的,但它非常酷,它简化了代码并缩短了代码。

答案 4 :(得分:2)

效率不高,但有效

while(list.remove(null));

答案 5 :(得分:1)

当前答案无法区分可变列表和不可变列表,我发现很多遗漏方式。尽管传递了一个List.of(..)元素,但cannot以来引入的null变得更加重要。无论如何,删除都是相关的(例如删除某个非null元素)。

不可变列表

不可变列表的一个示例是Arrays.asList(..)(但是元素仍然可以替换,但是不能添加/删除)或已经提到过List.of(..)。只要不能使用List方法添加/删除元素,这些就被视为“不可变包装器”。

List<String> immutableList = Arrays.asList("one", null, "two");
    使用Stream#filter(Predicate)方法从开始的
  • List<String> newList = immutableList.stream()
        .filter(Objects::nonNull)
        .collect(Collectors.toList());
    
  • 带索引或增强索引的逐个​​循环适用于Java版本及更低版本(不仅适用)。

    // note we need to create a mutable List to add the non-null elements
    List<String> newList = new ArrayList<>();
    for (String str: immutableList) {
        if (str != null) {
             newList.add(str);
        }
    }
    

可变列表

可变列表的一个示例是List接口的新实例,例如new ArrayList<>()new LinkedList<>()。它们是易变的,因此可以使用List#addList#addAll添加元素,并且是一种常用的方法。

List<String> mutableList = new ArrayList<>(Arrays.asList("one", null, "two"));

以下列出了从此类null中删除所有List元素的方法。请注意,它修改了列表。

    截至
  • List#removeIf(Predicate)

    mutableList.removeIf(Objects::isNull);
    
  • Iterator是从List删除元素的推荐方法,并且(不仅)适用于Java版本及更低版本

    Iterator<String> iterator = mutableList.iterator();
    while (iterator.hasNext()) {
        if (iterator.next() == null) {
            iterator.remove();
        }
    }
    
  • 不可变列表部分中提到的所有方式始终会产生新的List

答案 6 :(得分:0)

如果您自己构建列表并且不确定该值是否为null,则还可以使用CollectionUtils.addIgnoreNull(list,elementToAdd);这将阻止添加空元素。这仅在构造列表时有效。如果您从其他地方收到列表并希望在使用列表之前删除所有非null元素,那么list.removeAll(Collections.singleton(null));将是最好的

答案 7 :(得分:0)

for (int i = 0; i <array.size(); i++) {
    for (int j = 0; j < array.size()-i-1; j++) {
        if (array.get(j) > array.get(j+i)){
            Integer t = array.get(j+i);
            array.set(j+i,array.get(j));
            array.set(j,t);
        }
    }
}

for(int i = array.size()-1; i >= 0; i--){

它是一个升序,这个问题的降序是什么?

答案 8 :(得分:0)

使用google.common.

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

public List<String> removeBlanks(List<String> list) {
    return Lists.newArrayList(Iterables.filter(list, new Predicate<String>() {

        @Override
        public boolean apply(String arg) {
            return StringUtils.isNotEmpty(arg);
        }
    }));
}