面试:Stream#foreach方法摸底三问,你都了解吗

JAVA8 新增了 Stream API,而在 Stream API 中又为程序员提供了一个遍历集合的 foreach 方法:java.util.stream.Stream#forEachjava

那你对这个 foreach 方法了解多少呢?快来回答这几个问题吧。程序员

问题 1:foreach 是顺序消费吗

如题。foreach 是顺序消费吗?源码分析

个人答案是:不必定。code

在并行流中调用java.util.stream.Stream#forEach方法时并不会保证元素消费的前后顺序。blog

若是须要在并行流中保证元素顺序消费须要使用java.util.stream.Stream#forEachOrdered方法。源码

foreach是顺序消费吗

问题 2:foreach 是快速失败吗

废话很少说,直接上代码,眼见为实:io

foreach是快速失败吗

经过示例程序咱们能够知道,程序的确是抛了ConcurrentModificationException异常,可是java.util.stream.Stream#forEach方法抛异常的时机是在消费完原先的全部的元素以后,而不是像迭代器的那样快速失败模式。class

问题 3:foreach 以前添加元素会怎么样

如下代码的执行结果是什么?会抛异常吗?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

正确答案是:不会抛异常,而且是输出修改以后的元素。执行结果以下:

在foreach以前添加元素会抛异常吗

做业

终极提问:java.util.stream.Stream#forEach方法底层是怎么实现的呢?有兴趣的同窗能够先本身看看源码,源码分析会在下期更新哦。


欢迎关注我的公众号:
Coder小黑

相关文章
相关标签/搜索