Java 8的Collection
接口提供了一个新的删除元素的方法,boolean removeIf(Predicate<? super E> filter)
。
它可以接受一个Lambda做为参数。
用这个方法可以写出更简洁的代码。
用一行代码,items.removeIf(i -> isDeletable(i));
,就可以替代下面的代码。
for (Iterator it = items.iterator(); it.hasNext();) {
if (isDeletable(it.next())) {
it.remove();
}
}
另外,对于ArrayList
而言,使用removeIf
比传统的iterator方式更快。
传统的iterator方式,每删除一个元素E都要把E之后的所有元素往前移动一位。
如果ArrayList
的大部分元素都要被删除,那么时间复杂度会是O(n^2)级别。
(实际上,Collection
接口提供的默认removeIf
实现就是用iterator方式来做删除的。)
ArrayList
类override了removeIf
方法,提供了更高效的实现。
新的实现先用一个BitSet
在一趟循环中标记哪些元素需要删除(O(n)复杂度),然后再在一趟循环中移动要保留的元素(O(n)复杂度)。