JAVA8 新增了 Stream API,而在 Stream API 中又为程序员提供了一个遍历集合的 foreach 方法:java.util.stream.Stream#forEach
。java
那你对这个 foreach 方法了解多少呢?快来回答这几个问题吧。程序员
如题。foreach 是顺序消费吗?源码分析
个人答案是:不必定。code
在并行流中调用java.util.stream.Stream#forEach
方法时并不会保证元素消费的前后顺序。blog
若是须要在并行流中保证元素顺序消费须要使用java.util.stream.Stream#forEachOrdered
方法。源码
废话很少说,直接上代码,眼见为实:io
经过示例程序咱们能够知道,程序的确是抛了ConcurrentModificationException
异常,可是java.util.stream.Stream#forEach
方法抛异常的时机是在消费完原先的全部的元素以后,而不是像迭代器的那样快速失败模式。class
如下代码的执行结果是什么?会抛异常吗?stream
public static void main(String[] args) { List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4)); Stream<Integer> stream = list.stream(); list.add(6); stream.forEach(System.out::println); }
思考一分钟。foreach
正确答案是:不会抛异常,而且是输出修改以后的元素。执行结果以下:
终极提问:java.util.stream.Stream#forEach
方法底层是怎么实现的呢?有兴趣的同窗能够先本身看看源码,源码分析会在下期更新哦。
欢迎关注我的公众号: