面試:Stream#foreach方法摸底三問,你都了解嗎


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方法。

foreach是順序消費嗎

問題 2:foreach 是快速失敗嗎

廢話不多說,直接上代碼,眼見為實:

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);
}

思考一分鍾。

正確答案是:不會拋異常,並且是輸出修改之后的元素。執行結果如下:

在foreach之前添加元素會拋異常嗎

作業

終極提問:java.util.stream.Stream#forEach方法底層是怎么實現的呢?有興趣的同學可以先自己看看源碼,源碼分析會在下期更新哦。


歡迎關注個人公眾號:
Coder小黑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM