List<Integer> integer = Stream.generate(new Supplier<Integer>() {
int i = 0 ;
@Override
public Integer get() {
return ++i;
}
}).filter(j -> j < 5)
.limit(10) // Note the call to limit here
.collect(Collectors.toList());
出乎我的意料,collect
调用永远不会返回。在 filter
之前设置 limit
会产生预期的结果。为什么?
最佳答案
由于只有 4 个元素通过过滤器,limit(10)
永远不会达到 10 个元素,因此 Stream 管道不断生成新元素并将它们提供给过滤器,试图达到 10 个元素通过过滤器,但由于只有前 4 个元素通过过滤器,处理永远不会结束(至少在 i
溢出之前)。
Stream 管道不够聪明,无法知道没有更多元素可以通过过滤器,因此它会不断处理新元素。
关于java - 为什么 Stream.limit 在此代码段中没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34172978/