考虑下面的代码: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