都java1.8了,你还不会遍历`List`时移除元素吗?
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 collections 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));
上一篇:
IDEA上Java项目控制台中文乱码