过滤列表,无需迭代

| 在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());
    

要回复问题请先登录注册