1.8之前,如何在遍历List
的同时移除元素?没错,就是使用 Iterator
迭代器
List<String> list = new ArrayList<>();
list.add("add");
list.add("remove");
Iterator<String> iterator = list.iterator();
String condition = "remove";
while (iterator.hasNext()) {
String next = iterator.next();
if (next.equals(condition)) {
iterator.remove();
}
}
java1.8
之后,顶级接口Collection
新加入了一个默认方法removeIf
,见名知意,就是用来移除符合条件的元素的
/**
* Removes all of the elements of this collection that satisfy the given
* predicate. Errors or runtime exceptions thrown during iteration or by
* the predicate are relayed to the caller.
* 移除所以满足filter条件的元素,如果发生了错误,将反馈给调用者
*
* @implSpec
* The default implementation traverses all elements of the collection using
* its {@link #iterator}. Each matching element is removed using
* {@link Iterator#remove()}. If the collection's iterator does not
* support removal then an {@code UnsupportedOperationException} will be
* thrown on the first matching element.
* 默认使用iterator迭代器移除元素,如果集合不支持跌代器模式,就会抛出UnsupportedOperationException(不支持的操作)异常
*
* @param filter a predicate which returns {@code true} for elements to be
* removed
* filter条件为真时,移除当前元素
* @return {@code true} if any elements were removed
* 如果元素被移除成功,将返回真
* @throws NullPointerException if the specified filter is null
* filter断言如果为空,抛出NullPointerException(空指针)异常
* @throws UnsupportedOperationException if elements cannot be removed
* from this collection. Implementations may throw this exception if a
* matching element cannot be removed or if, in general, removal is not
* supported.
* @since 1.8
*/
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
代码实现:
List<String> list = new ArrayList<>();
list.add("add");
list.add("remove");
String condition = "remove";
list.removeIf(e -> e.equals(condition));