问题描述
|
在Java中是否可以根据某些条件过滤列表而不进行迭代?我有一个大小为10000的完整的bean列表,这些bean具有boolean类型的属性。如果我想基于该布尔属性过滤该列表,是否有必要迭代整个List或是否有其他方法?
解决方法
如果您的意思是不使用
Iterator
,那么答案是是。例如:
for (int i = 0; i < list.size(); ) {
MyElement element = list.get(i);
if (element.getMyProperty()) {
list.remove(i);
} else {
i++;
}
}
取决于List
实现,这可能是比使用Iterator
和Iterator.remove()
实现过滤的昂贵方法。 (例如,如果list是LinkedList
,则list.get(i)
和list.remove(i)
都是O(N)
,因此列表过滤是O(N^2)
。相反,用Iterator
过滤相同的列表将是O(N)
。)
但是,如果您询问是否可以在不检查列表中的每个元素的情况下过滤列表,那么答案是“否”。您需要一些辅助数据结构,或者需要对列表进行排序以使其性能优于O(N)
。过滤。
,您有10000种事物的清单,并且希望能够按照某种标准选择其中的一些事物,而又不必实际依次查看每个事物是否符合条件?嗯...不您也许可以找到一个库来隐藏您的迭代,但是最终您将不得不访问每个项目以查看其是否匹配。
,您可以编写一个实现List接口的包装器类,并仅“隐藏”具有所述属性的所有bean。但是,许多操作(例如,每个基于索引的函数)效率很低,因此,这取决于您要对“过滤后的”列表执行的操作是什么。
,您可以使用Java 8中的流来执行此操作。假设您有电动汽车和非电动汽车的列表,并且只想提取电动汽车:
List<Car> electricCars= cars.stream().filter(c -> c.isElectric()).collect(Collectors.toList());