Stream.spliterator 对于并行流的奇怪行为

2024-02-11

我直接使用流分割器来执行我正在编写的库中的低级操作。最近,当我使用流分割器和交错时,我发现了非常奇怪的行为tryAdvance/trySplit来电。这是演示该问题的简单代码:

import java.util.Arrays;
import java.util.Spliterator;

public class SpliteratorBug {
    public static void main(String[] args) {
        Integer[][] input = { { 1 }, { 2, 3 }, { 4, 5, 6 }, { 7, 8 }, { 9 } };
        Spliterator<Integer> spliterator = Arrays.stream(input).parallel()
                .flatMap(Arrays::stream).spliterator();
        spliterator.trySplit();
        spliterator.tryAdvance(s -> {});
        spliterator.trySplit();
        spliterator.forEachRemaining(System.out::println);
    }
}

输出是

5
6
9

如您所见,在平面映射之后,我应该从以下位置获取连续数字的有序流1 to 9。我将分离器分开一次,因此它应该跳转到某个中间位置。接下来,我使用其中的一个元素并将其再次拆分。之后我打印所有剩余的元素。我希望我将从流尾部获得几个连续的元素(可能为零元素,也可以)。然而我得到的是5 and 6,然后突然跳到9.

我知道目前 JDK 中的分割器不是这样使用的:它们总是在遍历之前分割。然而官方文档 https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html没有明确禁止调用trySplit after tryAdvance.

当我使用直接从集合、数组、生成源等创建的 spliterator 时,从未观察到该问题。仅当 spliterator 是从具有中间值的并行流创建时才会观察到该问题flatMap.

所以问题是:我是否遇到了错误,或者明确禁止某处以这种方式使用 spliterator ?


从文档Spliterator.trySplit() http://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html#trySplit--:

这个方法可能会返回null出于任何原因,包括空虚,遍历开始后无法分裂、数据结构约束和效率考虑。

(emphasis mine)

因此,文档明确提到了在开始遍历后尝试分裂的可能性,并建议无法处理此问题的分裂器可能会返回null.

因此,对于有序分裂器,观察到的行为应该被视为错误正如米莎所描述的 https://stackoverflow.com/a/31154460/2711488。一般来说,事实是trySplit()必须返回一个prefix换句话说,分裂器必须将有关下一个项目的所有中间状态移交给新的分裂器,这是分裂器的一个特点Spliterator容易出现错误的 API。我把这个问题作为检查我自己的 spliterator 实现的动机,并发现了一个类似的错误......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stream.spliterator 对于并行流的奇怪行为 的相关文章

随机推荐

  • 为什么波浪号和斜杠在 Asp.net MVC 应用程序中不起作用?

    当我写这段代码时 string filePaths Directory GetFiles Content Images I get System IO DirectoryNotFoundException Could not find a
  • 如何将 CSV 加载到 IPython 笔记本中

    我有一个 csv 文件准备加载到我的 python 代码中 但是 我想将其加载为以下格式 data A B C D A B C D A B C D 我将如何加载可作为 numpy 数组读取的 csv 文件 例如 仅仅使用以前的教程就会对使用
  • Rails 模型中的虚拟属性

    在我的控制器中 我在 for 循环中调用 hour shopper add product 我的模型看起来像 class Shopper lt ActiveRecord Base attr accessor quantity def add
  • 返回一个 Disposable 对象以在 using 块中使用

    如何在函数中返回一次性对象以确保它在函数内正常工作using堵塞 在我的函数中 我想对一次性对象进行操作并解释错误 这使事情变得复杂 到目前为止 我有类似于以下代码的内容 DBHandle GetDB I can t do this bec
  • 以编程方式单击按钮 - JS

    我在其他网络应用程序中看到过这样做 但我对 Javascript 还很陌生 无法自己真正弄清楚这一点 我想以编程方式创建一个 Google Hangout 但是 在官方 API 中 创建环聊的唯一方法是在页面上添加环聊按钮 这是有关环聊按钮
  • 使用 MockEndPointsandSkip 进行 Camel 单元测试

    我是 Camel 新手 正在尝试一些代码来了解 MockEndpoints 功能的工作原理 但它不起作用 以下是我想使用 MockEndpoints 进行单元测试的 Camel 路线 属性值在 application properties
  • 根据下拉选择更改表单操作

    需要表单根据特定下拉菜单中的选择来更改其操作 更改时应触发脚本并在用户提交之前更改操作 当您刚接触 JS 时 说起来容易做起来难 感谢您的帮助 Javascript
  • 创建仅打印到一行的 XML

    我创建了一些将映射写入 XML 的代码 它似乎可以工作 但打印的文件没有新行 所以在任何 XML 编辑器中它都只占一行 如何让它为每个孩子打印到新行 DocumentBuilderFactory dbf DocumentBuilderFac
  • Make:对 docker 镜像的依赖

    我正在使用 docker 工作流程根据给定的规范文件生成一些文件 其中 Makefile 为 它根据 OpenAPI 规范生成客户端 SWAGGER PWD swagger yaml GENERATOR openapitools opena
  • 如何从头开始对包使用 org.apache.felix.scr 注释?

    我已经开始为 apache felix 开发一个包 并使用 ops4j pax 插件来完成 我已经创建了项目结构pax create project在那里做了正常的pax create bundle 然后你就得到了用 Maven 构建整个项
  • 无法调试 Objective-C 应用程序中嵌入的 Swift 模块/框架

    替代标题 以帮助搜索 无法调试链接到 Xcode 8 中的 Objective C 应用程序的 Swift 2 3 框架 error in auto import failed to get module XYZ from AST cont
  • 我可以在 Python 中从后台线程渲染 openCV 动画吗?

    我可以在 Python 中从后台线程渲染 openCV 动画吗 这是我的尝试 import cv2 import numpy as np from time import sleep bitmap np zeros 512 512 3 np
  • 使用 JsonConverter 进行 OnDeserialized 回调

    我正在尝试使用JsonConverter from 这个答案 https stackoverflow com a 33094930 2120779 to 我可以在属性中指定路径以将类中的属性映射到 JSON 中的子属性吗 https sta
  • 如何强制象限的每个部分仅占据其四分之一的区域(HTML/CSS)?

    我需要创建一个 仪表板 模型 显示四个等大小的正方形 以下关键 html 和 css 是我尝试实现此目的所使用的
  • 如何在编辑文本聚焦时显示软键盘

    我想在按下键盘时自动显示软键盘EditText焦点集中 如果设备没有物理键盘 并且我有两个问题 When my Activity显示 我的EditText获得焦点但键盘不显示 我需要再次单击它才能显示键盘 当我的Activity被展示 当我
  • 将 keyAdapter 替换为按键绑定

    由于键适配器无法正常工作 我如何在此代码中使用键绑定 我已经查看了键绑定的文档 但我不明白如何执行此操作 private class KeyLis extends KeyAdapter Override public void keyPre
  • 如何在 gcloud python 实例中按网络IP进行过滤

    我正在使用 gcloud python 客户端库 https github com google google api python client https github com google google api python clie
  • 我可以 LINQ JSON 吗?

    这是我从 NET 上的请求中获取的 JSON id 110355660738 picture data url https fbcdn profile a akamaihd net hprofile ak prn2 1027085 1203
  • 没有路由匹配 service-worker.js

    我生成了 Rails 应用程序 并立即收到此消息 我不知道 service worker js 是什么 但我认为它可以与一些默认的 gem 捆绑在一起 Started GET service worker js for 127 0 0 1
  • Stream.spliterator 对于并行流的奇怪行为

    我直接使用流分割器来执行我正在编写的库中的低级操作 最近 当我使用流分割器和交错时 我发现了非常奇怪的行为tryAdvance trySplit来电 这是演示该问题的简单代码 import java util Arrays import j