当前位置: 首页 > 知识库问答 >
问题:

JavaStream生成的值超过限制集[重复]

徐秋月
2023-03-14

出于某种原因JavaStream生成了更多的值(调用迭代器的hasNext()和Next()方法。

这是合成示例。

我有一个迭代器形式的生成器:

@RequiredArgsConstructor
static class TestIterator implements Iterator<Integer> {
    private final int bound;
    private final Random rnd = new Random();

    private int current = 0;

    @Override public boolean hasNext() {
        return current < bound;
    }

    @Override public Integer next() {
        current = rnd.nextInt(20);
        System.out.println("Generated: " + current);
        return current;
    }
}

现在,我试图有一个平坦的Stream,它由几个迭代器组成

public static void main(String... args) {

    List<Iterator<Integer>> iterators = asList(
        new TestIterator(18),
        new TestIterator(18),
        new TestIterator(18));
    Stream<Integer> streams = iterators.stream()
        .map(iter -> (Iterable<Integer>) () -> iter)
        .flatMap(iter -> StreamSupport.stream(iter.spliterator(), false)) // <-- Here the stream of streams is flatten to a single stream of integers and 'parallel' is set to false
        .limit(5); // <-- Here the limit is set

    streams.forEach(i -> System.out.println("***Consumed: " + i));
}

令人惊讶的是,我的输出如下:

Generated: 1
***Consumed: 1
Generated: 19
***Consumed: 19
Generated: 7
***Consumed: 7
Generated: 7
***Consumed: 7
Generated: 7
***Consumed: 7
Generated: 4
Generated: 3
Generated: 8
Generated: 14
Generated: 0
Generated: 16
Generated: 10
Generated: 3
Generated: 19

因此,Stream生成的结果比forEach中传递给使用者的结果要多。即使它被显式设置为“parallel = false”。

在我的真实场景中,hasNext()和Next()函数非常昂贵,从外部服务获取数据。

有人能解释如何在限制结果方面做得更好吗?

提前谢谢。

共有2个答案

金嘉言
2023-03-14

因为它是一个不可变的值,所以你的 hasNext() 函数调用在没有停止的情况下运行的原因。

郎言
2023-03-14

这是一个已知的JDK错误,已在JDK10中修复,并被后移植到openjdk8u222,因此更新Java版本将解决此问题。

 类似资料:
  • 问题内容: 标题可能有些混乱,所以请允许我解释一下。我正在使用一张桌子记录我的工作日志。每天我都会创建一个条目,说明从什么时间到什么时间工作,并添加一条注释来描述我的工作。 然后,我使用查询来比较时间戳,以准确计算出当天我工作了多少小时和几分钟。此外,我使用查询来计算我全年工作的小时数和分钟数的总和。那就是我遇到问题的地方。我的查询如下。 默认情况下,MySQL TIME字段允许的时间范围为’-8

  • 我使用Jmeter将工作负载注入部署在AWS EC2实例上的应用程序。测试必须非常庞大:它持续10个小时,工作负载配置文件具有双峰形状,在5分钟内大约有2600个请求。实际上我有一个m3。部署应用程序的xlarge实例,8 m3。xlarge实例每个实例运行一个jmeter实例。使用python脚本,要注入的工作负载在8个客户机实例之间进行分割,因此在示例中,如果原始工作负载要注入800个请求,那

  • 我有一个java Spring应用程序在AWS C4上运行。大(4 Gb内存)与Apache Tomcat 8.我得到java.lang.OutOfMemoryError GCOverhead限制超过错误,同时在服务器启动期间实例化30000条记录的bean。 引起原因:org.springframework.beans.BeanInstantiation异常:未能实例化[java.lang.字符

  • 在Android Studio1.5.1只是通过移动源代码从一个系统到另一个即使干净的构建是成功的,但当代码运行我得到这种错误 java.lang.OutOfMemoryError: GC开销限制超过错误:任务': app: dexDebug'执行失败。 我在应用程序中添加了以下代码。格拉德尔还:

  • 在我的jenkins工作中,我得到这个错误为我的bot用户。我的限制是5000,我看到每秒钟大约有100个请求,我不确定哪个工作/服务正在使用机器人的请求。理想情况下,我的其他jenkins工作应该每分钟最多占用1个请求。 有没有办法找出是什么导致了如此高的请求率?或者任何API调用来列出在最后一分钟内进行的所有API调用或类似的东西?

  • 问题内容: 因此,我正在处理在Websphere 7(JDK 6)上运行的旧servlet代码。开发环境设置使用Tomcat 6(JDK 6)。 为什么它在Websphere 7上而不在Tomcat 6上可以工作? 这与应用程序服务器有关吗? 如果您的回答为“是”,则为“否”。2,除了分解代码或使用动态包含之外,您在Tomcat 6(JDK 6)上是否有解决方法? 该计划与将静态包含更改为动态包含