过滤列表而不进行迭代

时间:2011-04-14 09:57:58

标签: java collections filter

在Java中是否可以在没有迭代的情况下根据某些条件过滤List?我有一个大小为10000的Bean列表,其中这些bean具有boolean类型的属性。如果我想根据该布尔属性过滤该列表,是否需要迭代整个List或者还有其他方法?

4 个答案:

答案 0 :(得分:2)

你有一个10000件事的清单,你想要神奇地能够通过一些标准选择其中的一些,而不是实际依次去每一个,看看它是否符合标准?嗯......不。您可能能够找到一个隐藏迭代的库,但最终您将不得不访问每个项目以查看它是否匹配。

答案 1 :(得分:1)

如果您的意思是,不使用Iterator,则答案为是。例如:

for (int i = 0; i < list.size(); ) {
    MyElement element = list.get(i);
    if (element.getMyProperty()) {
        list.remove(i);
    } else {
        i++;
    }
}

根据List实施,与使用IteratorIterator.remove()相比,这可能是实施过滤的一种昂贵方式。 (例如,如果列表是LinkedList,那么list.get(i)list.remove(i)都是O(N),因此列表过滤是O(N^2)。相比之下,过滤相同的带Iterator的列表为O(N)。)


但是,如果您询问是否可以在不检查列表中的每个元素的情况下过滤列表,那么答案是否定的。您需要一些辅助数据结构,或者要在属性上订购列表以实现更好比O(N)过滤。

答案 2 :(得分:1)

您可以编写一个实现List接口的包装器类,并使用所述属性“隐藏”所有bean。然而,许多操作(例如,每个基于索引的函数)的效率都非常低,因此它取决于您对“过滤”列表的确切要求。

答案 3 :(得分:0)

您可以使用Java 8中的流来执行此操作。假设您有一个电动和非电动汽车列表,并且您只想提取电动:

List<Car> electricCars= cars.stream().filter(c -> c.isElectric()).collect(Collectors.toList());