考慮下面的代碼:flatMap是否保證懶惰?
urls.stream()
.flatMap(url -> fetchDataFromInternet(url).stream())
.filter(...)
.findFirst()
.get();
將fetchDataFromInternet
堪稱爲第二網址時,第一個是夠嗎?
我嘗試了一個較小的例子,它看起來像按預期工作。即逐個處理數據,但這種行爲是否可以依賴?如果沒有,請撥打.sequential()
之前.flatMap(...)
幫忙嗎?
Stream.of("one", "two", "three")
.flatMap(num -> {
System.out.println("Processing " + num);
// return FetchFromInternetForNum(num).data().stream();
return Stream.of(num);
})
.peek(num -> System.out.println("Peek before filter: "+ num))
.filter(num -> num.length() > 0)
.peek(num -> System.out.println("Peek after filter: "+ num))
.forEach(num -> {
System.out.println("Done " + num);
});
輸出:
Processing one
Peek before filter: one
Peek after filter: one
Done one
Processing two
Peek before filter: two
Peek after filter: two
Done two
Processing three
Peek before filter: three
Peek after filter: three
Done three
更新:使用Oracle官方JDK8如果該事項在實施
答:根據意見和下面的答案 ,flatmap是部分懶。即完全讀取第一個數據流,並且只在需要時讀取,接下來進行。閱讀流是急切的,但閱讀多個流是懶惰的。
如果這種行爲是有意的,那麼API應該讓該函數返回一個Iterable
而不是一個流。
換句話說:link
關於[並行性](https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html)上的文檔說「創建流時,除非另有說明,否則它始終是串行流。 「,所以調用'.sequential()'是沒有必要的。 – teppic
是什麼讓你覺得它不是? – pedromss
@pedromss文檔沒有明確說明。 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#flatMap-java.util.function.Function- 而且看起來好像有幾種情況可能不會是懶惰的:https://stackoverflow.com/questions/29229373/why-filter-after-flatmap-is-not-completely-lazy-in-java-streams – balki