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
方法底層是怎麼實現的呢?有興趣的同窗能夠先本身看看源碼,源碼分析會在下期更新哦。
歡迎關注我的公衆號: