面試: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小黑

相關文章
相關標籤/搜索