Iterable 接口定义了 default 方法 forEach 它的参数类型是个Consumer 函数接口。
继承关系:
废话不多说直接上的源码:
public interface Iterable {
Iterator iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
} 既然是在 for(item : list) 上封装的,那在 list上直接 remove 的老问题还是一样的:
报 java.util.ConcurrentModificationException 异常
@Test
public void testForEach(){
List numbers = IntStream.range(1, 5)
.boxed()
.collect(Collectors.toList());
numbers.forEach(i -> {
if(i == 2){
numbers.remove(i); // 异常
}
});
} 如果只是单纯的按条件 remove 元素,推荐来自 Collection Java8 新增的默认方法removeIf。
参数为一个 Predicate 就是一个作为过滤器的 lambda 它返回 boolean。
List list = IntStream.range(1, 5)
.boxed()
.collect(Collectors.toList());
list.removeIf( i -> i == 2 );
System.out.println(list); // [1, 3, 4] | 留言与评论(共有 0 条评论) “” |