使用Iterator从List中删除包含null的元素

时间:2015-04-09 14:21:46

标签: java collections null core

List<Integer> list = new ArrayList<>();
list.add(12);
list.add(null);
list.add(22);
list.add(32);

System.out.println(list);

Iterator<Integer> iterator = list.iterator();

while(iterator.hasNext()){
        Integer a = iterator.next();
        System.out.print(a+" ");

        if(a.equals(32)){  
        iterator.remove();
        }
    }

O / P

[12, null, 22, 32]
12 null Exception in thread "main" java.lang.NullPointerException
at javed.collection.Collecting.main(Collecting.java:57)

尝试从包含null的List中删除任何元素会给我NullPointerException。 但是可以轻松地从List中包含不带null的元素。 我通过将整数与null进行比较来做错事吗?

如果我们不能从List中删除包含null的元素,而不是它们允许我们在List中添加null的原因,那么它的用途是什么。

6 个答案:

答案 0 :(得分:2)

你应该添加一个空检查:

if(a != null && a.equals(32)) {
    iterator.remove();
}

您还可以使用Objects.equals为您执行空检查:

if(Objects.equals(a, 32)) {

答案 1 :(得分:0)

更改条件语句:

if(a.equals(32)){  
   iterator.remove();
}

为:

Integer toCheck = 32;
if(toCheck.equals(a)){  
    iterator.remove();
}

避免可能的空引用

答案 2 :(得分:0)

如果您在null变量上调用任何方法,则会获得NullPointerException。这意味着,如果anull并且您尝试拨打a.equals(32),那么它将是NPE。

您只需输入:

即可对变量进行空值检查
if (a!=null && a==32) {
    //whatever
}

另一方面,您不必手动遍历列表以从中删除特定元素。有一种方法可以帮到你:

list.remove(Integer.valueOf(32));

答案 3 :(得分:0)

您绝对可以从包含空引用的列表中删除 - 您无法在空引用上调用equals。问题出在这里:

if(a.equals(32))

如果NullPointerExceptiona,则null会失败。关于那个没有没有特定于列表的列表。如果没有列表或迭代器,您可以获得完全相同的行为:

Integer a = null;
if (a.equals(32)) // Bang!
    ...

最简单的修复方法是检查无效:

if (a != null && a == 32)

(比较现在使用拆箱,而不是每次迭代时装箱32 - 这仍然很便宜,但不是可读的IMO。)

或者以盒装Integer值开头:

Integer valueToRemove = 32;
while(iterator.hasNext()){
    Integer a = iterator.next();
    System.out.print(a+" ");

    if(valueToRemove.equals(a)) {
        iterator.remove();
    }
}

答案 4 :(得分:0)

你可以这样做:

if (a != null && a == 32) {
    iterator.remove();
}

但由于a的隐含框/取消框,这不是一个好习惯。

最快的方式是:

Iterator<Integer> iterator = list.iterator();
Integer matcher = 32;
while(iterator.hasNext()){
    Integer a = iterator.next();
    System.out.print(a+" ");

    if(matcher.equals(a)){  
        iterator.remove();
    }
}

答案 5 :(得分:0)

此行将从列表中删除所有空值

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