JAVA8 新增了 Stream API,而在 Stream API 中又為程序員提供了一個遍歷集合的 foreach 方法:java.util.stream.Stream#forEach
。
那你對這個 foreach 方法了解多少呢?快來回答這幾個問題吧。
問題 1:foreach 是順序消費嗎
如題。foreach 是順序消費嗎?
我的答案是:不一定。
在並行流中調用java.util.stream.Stream#forEach
方法時並不會保證元素消費的先后順序。
如果需要在並行流中保證元素順序消費需要使用java.util.stream.Stream#forEachOrdered
方法。
問題 2:foreach 是快速失敗嗎
廢話不多說,直接上代碼,眼見為實:
通過示例程序我們可以知道,程序的確是拋了ConcurrentModificationException
異常,但是java.util.stream.Stream#forEach
方法拋異常的時機是在消費完原先的所有的元素之后,而不是像迭代器的那樣快速失敗模式。
問題 3:foreach 之前添加元素會怎么樣
以下代碼的執行結果是什么?會拋異常嗎?
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);
}
思考一分鍾。
正確答案是:不會拋異常,並且是輸出修改之后的元素。執行結果如下:
作業
終極提問:java.util.stream.Stream#forEach
方法底層是怎么實現的呢?有興趣的同學可以先自己看看源碼,源碼分析會在下期更新哦。
歡迎關注個人公眾號: