iterator.remove()不起作用

enyaitl3  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(362)

我有一个列表,比方说car,我必须根据特定条件从列表中删除值,所以如果值为null,那么我必须从列表中删除值。我的代码看起来像:

List<CarDTO> carList //list 
Iterator<CarDTO> itr = carList.iterator();
while (itr.hasNext())
{
    CarDTO car = itr.next();
    String carText = car.getCarText();
    carText = replaceCarTextWithCompanyName(carText, readData);
    if (CommonUtils.isEmpty(carText))
    {
        itr.remove();   //this is not working, values are still getting displayed
    }
    else
    {
        car.setCarText(carText);
    }
}
6ojccjat

6ojccjat1#

或者 CommonUtils.isEmpty 未正确实施或实施方式与您的期望不同。我建议你使用标准的java函数, String#isBlank 相反。
演示:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>(List.of("Hello", "", "\t", "\n", "World"));

        System.out.println("Before:");
        list.forEach(s -> System.out.println("=>" + s + "<="));

        Iterator<String> itr = list.iterator();
        while (itr.hasNext()) {
            String s = itr.next();
            if (s != null && s.isBlank()) {
                itr.remove();
            }
        }

        System.out.println("After:");
        list.forEach(s -> System.out.println("=>" + s + "<="));
    }
}

输出:

Before:
=>Hello<=
=><=
=>  <=
=>
<=
=>World<=
After:
=>Hello<=
=>World<=

注: String#isBlank 从java-11开始提供。如果您使用的是较低版本,请使用 s.trim().isEmpty() 在上面给出的代码中。

6ju8rftf

6ju8rftf2#

这里有一个例子:

List<String> names = new ArrayList<>(Arrays.asList("Bob", "Don", null, "Mark", null, "John"));

    List<String> newNames = names.stream()
        .filter(Objects::nonNull)
        .collect(Collectors.toList())
        ;

    newNames.forEach(System.out::println);

相关问题