Java 8 流 : java. lang.IllegalStateException:结束大小 84758 小于固定大小 84764

标签 java java-stream

我正在使用 Java 8 streams API 将映射值转换为数组。我收到以下异常:

Unhandled exception ScheduledExecutorService : java.lang.IllegalStateException: End size 84758 is less than fixed size 84764
        at java.util.stream.Nodes$FixedNodeBuilder.end(Nodes.java:1232)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:545)
        at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
        at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
        at com.turnoutnow.businesslogic.Worker.generateVisitsToESAndS3(Worker.java:213)

我正在 Google 上搜索异常,但没有找到任何关于该错误的有用信息。谁能告诉我这个错误的确切原因是什么?

编辑

这是一行代码:

visits.getVisitDataMap().values().stream().toArray(n -> new VisitDataBE[n]);

最佳答案

您当前的代码是正确的,因为您正在创建大小合适的数组。您可以将其简化为 .toArray(VisitDataBE[]::new)

很可能在 toArray() 运行时,其他线程正在从 visits.getVisitDataMap() 映射中删除元素。您可以通过创建 Map 的防御副本来检验这个假设:

Map<...> copy = new HashMap<>(visits.getVisitDataMap());
copy.values().stream().toArray(n -> new VisitDataBE[n]);

正确的修复取决于您的应用程序的多线程语义。

关于Java 8 流 : java. lang.IllegalStateException:结束大小 84758 小于固定大小 84764,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57274369/

相关文章:

java - 在 Multimap 内循环 Multimap

java - 使用泛型类作为类型参数

java - 将 LibGDX 像素图转换为 Android 位图

java - Selenium 网络驱动程序 : How to select the dynamically generated button by taking the reference of previuos tag's xpath

java - 使用 Java 8 : Map<String, 基于对象的属性从 Map<String, Set<Object>> 中设置 <Object>> 进行过滤

java - 使用 Java 8 流将 2 个不同对象的列表连接到第三个对象的列表

java - Proguard.cfg 丢失

java - 如何从另一个maven模块导入Spring应用程序上下文?

java - 将一个对象映射到java流中的多个对象

Java 列表按日期过滤