Java8 学习笔记 - List.forEach() 和 for(item : list) 的区别


Iterable
接口定义了 default 方法 forEach 它的参数类型是个Consumer 函数接口
继承关系:


Java8 学习笔记 - List.forEach() 和 for(item : list) 的区别

废话不多说直接上的源码:

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 条评论) “”
   
验证码:

相关文章

推荐文章