java - 为什么 Stream.limit 在此代码段中没有按预期工作?

标签 java java-8 java-stream

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/

相关文章:

java - 小程序 - 无法写入文件

java - 如何设置JButton的背景?

java - Java 8 中的多个空值检查

java - Stream API - 如果 filter() 紧随其后,sorted() 操作如何工作?

java - 将 XML 中的元素分成单独的文件

java - 访问 xtext 中的类定义

java - 如何在 Java 中将 BigDecimal 转换为具有 2 位小数的 float

java - Eclipse:类型推断期间为 "Unknown error"

Java 8 Streams — 映射映射

java - 我可以展平多深度自引用实体吗?