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

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8 学习笔记 - List.forEach() 和 for(item : list) 的区别相关的知识,希望对你有一定的参考价值。

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

继承 继承 List Collection Iterable

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

public interface Iterable<T> 

    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) 
        Objects.requireNonNull(action);
        for (T t : this) 
            action.accept(t);
        
    

    default Spliterator<T> spliterator() 
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    

既然是在 for(item : list) 上封装的,那 remove 的老问题还是一样的:异常。

@Test
public void testForEach()
    List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
    numbers.forEach(i -> 
        if(i == 2)
            numbers.remove(i); // java.util.ConcurrentModificationException
        
    );

如果只是单纯的按条件 remove 元素,推荐来自 Collection Java8 新增的默认方法removeIf
参数为一个 Predicate 就是一个作为过滤器的 lambda 它返回 boolean

List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
numbers.removeIf(i -> i==2);
System.out.println(numbers);

参考资料

Interface Collection<E>
Interface Iterable<T>

高性能云服务器 精品线路独享带宽,毫秒延迟,年中盛惠 1 折起

以上是关于Java8 学习笔记 - List.forEach() 和 for(item : list) 的区别的主要内容,如果未能解决你的问题,请参考以下文章

列表学习笔记1⃣

java8stream学习笔记

java8 学习笔记

Java8学习笔记

Java8学习笔记

JAVA秒会技术之Java8新特性利用流快速处理集合的常见操作