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

水流的奇异行为。平行流的分裂器

夏侯涵映
2023-03-14
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

正如您所看到的,在平面映射之后,我应该得到从19的连续数字的有序流。我拆分了一次拆分器,所以它应该跳到某个中间位置。接下来,我从它中消耗一个元素,并再拆分一次。之后,我打印所有剩余的元素。我希望我将有几个连续的元素从流尾(可能零元素,也会很好)。然而,我得到的是56,然后突然跳转到9

我知道目前在JDK中拆分器不是这样使用的:它们总是在遍历之前拆分。但是,官方文档并没有明确禁止在TryAdvance之后调用TrySplit

当我使用直接从集合、数组、生成的源等创建的拆分器时,从来没有发现这个问题。只有当拆分器是从具有中间flatmap的并行流创建的时候,才会发现这个问题。

共有1个答案

南门星河
2023-03-14

spliterator.trysplit()的文档中可以看出:

此方法可能由于任何原因返回null,包括空、在遍历开始后无法拆分、数据结构约束和效率考虑。

(强调是我的)

 类似资料:
  • 结果:1 2 3 有人能解释为什么会发生这种情况,以及我如何让非并行版本给出与并行版本相同的结果吗?

  • 我知道在你的流中的任何时间点都可能发生再平衡。当它发生时,由于没有提交给定偏移量的最新偏移量,可能会发生事件的重新处理。 Kafka流是否允许在重新平衡发生之前完成任何飞行中处理?我的意思是,你的应用程序正在消耗一个记录(在你的过程方法内部),发生一个再平衡事件。该处理是否立即中止或允许处理方法完成? 一个具体的例子是 最后一次计算是否会在状态存储中结束并转发到接收器主题?因此,这意味着当重新平衡

  • 如果我想在Flink中分裂一个流,那么最好的方法是什么?

  • 1. 简介 行为流报告可以直观地展现用户从一个页面或事件到下一个页面或事件所经过的全部路径节点。通过对每一步行为、路径节点的分析,帮助您找出网站的潜在问题,进而制定完善的优化策略。 2. 使用说明 2.1 功能布局 行为流功能位于“行为分析”模块中,报告分为上半部的设置区域,与下方的分析结果展示区域。 2.2 基础设置操作 在分析云中,用户的每一个行为都可以用一个事件(包含页面浏览也是一个事件)来

  • 请注意:问题是基于旧的,现在称为“脚本”管道格式。当使用“声明性管道”时,并行块可以嵌套在阶段块内(请参见使用声明性管道的并行阶段1.2)。 我想知道并行步骤应该如何使用Jenkins工作流/管道插件,特别是。如何将它们与构建阶段混合。我知道一般的模式: 我可以并行地构建不同的阶段吗?或者“并行”步骤只意味着在单个阶段中使用?

  • 我看到一个奇怪的行为与ImageIO. read()方法。 我将InputStream传递给这个方法,当我第二次尝试读取它时,它无法读取并返回null。 我试图上传图像到亚马逊S3,我想创建3个版本的图像。原始和2缩略图。我的问题是,当我想创建2个缩略图时,我需要使用ImageIO. read()读取输入流。如果我运行这个方法2相同的InputStream我得到null为第二次读取。 我可以通过只