在Java中从集合中过滤元素的简单方法?

2022-09-02 00:09:03

我想编写一个方法,从遵循特定模式的集合中删除所有元素。在函数式语言中,我会将 filter() 与 lambda 表达式一起使用。但是,在Java中,我似乎坚持这一点:

public void removeAllBlueCars() {
    LinkedList<Car> carsToRemove = new LinkedList<Car>();
    for (Car c : cars) {
        if (c.getCarColor() == Color.BLUE) {
            carsToRemove.add(c);
        }
    }
    cars.removeAll(carsToRemove );
}

删除元素直接导致并发修改异常。有没有更好的方法来做到这一点,而不诉诸谷歌收藏?


答案 1

在 Java 8 中,您可以使用 Collection.removeIf 使用 lambda 表达式进行筛选。

cars.removeIf(c -> c.getCarColor() == Color.BLUE);

答案 2

也许你可以使用迭代器,它们更有效一些:

public void removeAllBlueCars() {
    Iterator<Car> carsIterator = cars.iterator();
    while (carsIterator.hasNext()) {
        Car c = carsIterator.next();
        if (c.getCarColor() == Color.BLUE) {
            carsIterator.remove();
        }
    }
}

另外,如果你想让这个解决方案更通用,我建议你像这样:

public interface Filter<T> {

    public boolean shouldRemove(T t);

}

你可以这样使用它:

public void removeCars(Filter<Car> filter) {
    Iterator<Car> carsIterator = cars.iterator();
    while (carsIterator.hasNext()) {
        Car c = carsIterator.next();
        if (filter.shouldRemove(c)) {
            carsIterator.remove();
        }
    }
}

您的方法按如下方式调用:

removeCars(new Filter<Car>() {

    public boolean shouldRemove(Car car) {
        return car.getCarColor() == Color.BLUE;
    }

});