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)复杂度)。