Java 请帮助我理解Flux.join参数

Java 请帮助我理解Flux.join参数,java,project-reactor,Java,Project Reactor,我有两个以不同速率发出的时间戳事件流,我想根据它们重叠的时间窗口将它们组合成一个复合流。这看起来像是Flux.join的教科书用法,但我不知道为几个参数提供什么。根据以下公式,参数为: other-与项目关联的其他发布者 leftEnd-返回发布者的函数,该发布者的发布指示要考虑的源值的时间窗口 rightEnd-返回发布者的函数,该发布者的排放指示要考虑的正确发布者值的时间窗口 resultSelector-一个函数,用于获取每个发布者发出的项目,并返回结果流发出的值 我知道,other是

我有两个以不同速率发出的时间戳事件流,我想根据它们重叠的时间窗口将它们组合成一个复合流。这看起来像是Flux.join的教科书用法,但我不知道为几个参数提供什么。根据以下公式,参数为:

  • other
    -与项目关联的其他发布者
  • leftEnd
    -返回发布者的函数,该发布者的发布指示要考虑的源值的时间窗口
  • rightEnd
    -返回发布者的函数,该发布者的排放指示要考虑的正确发布者值的时间窗口
  • resultSelector
    -一个函数,用于获取每个发布者发出的项目,并返回结果流发出的值
我知道,
other
是第二个要加入的通量,
resultSelector
是一个函数,它将每个通量中的单个值组合到结果或聚合值中,以在新通量上输出。但是我不能左右左右移动
leftEnd
rightEnd
。其目的必须是使联接运算符能够确定2个通量中的哪些值在时间上重叠。但是为什么这些函数必须返回发布者,这两个发布者怎么可能有不同的值类型呢?天真地说,我希望为每个输入流量生成一个函数,该函数提取每个值的时间戳或时间段,并使用一个比较器确定它们是否重叠,因此很明显,我没有“了解”到这一点

一个例子可能是正确的。让我们假设这两个输入通量具有相同的值类型,包括一个字符串和一个由长毫秒的beginTime和endTime表示的时间段,即

class ValueClass {
    String text;
    long beginTime;
    long endTime;
}
为简单起见,我将把值写为{“A”,0,250},用text=“A”,beginTime=0,endTime=250表示ValueClass对象。现在让我们假设两个输入通量产生以下值:

leftFlux: {"A", 0, 249}, {"B", 250, 499}, {"C", 500, 749}, {"D", 750, 999}
rightFlux: {"X", 0, 333}, {"Y", 334, 666}, {"Z", 667, 999}
"AX", "BX", "BY", "CY", "CZ", "DZ".
在时间轴上,我可以大致设想如下:

A   B   C   D
X     Y    Z
基于此,我希望连接的通量产生字符串值:

leftFlux: {"A", 0, 249}, {"B", 250, 499}, {"C", 500, 749}, {"D", 750, 999}
rightFlux: {"X", 0, 333}, {"Y", 334, 666}, {"Z", 667, 999}
"AX", "BX", "BY", "CY", "CZ", "DZ".
实现这一点的代码应类似于:

leftFlux.join(
    rightFlux,
    new Function<ValueClass, Publisher<something>>() {
            @Override
            public Publisher<something> apply(ValueClass v) {
                return some-publisher;
            }
        },
    new Function<ValueClass, Publisher<something>>() {
            @Override
            public Publisher<something> apply(ValueClass v) {
                return some-publisher;
            }
        },
    new BiFunction<ValueClass, ValueClass, String>() {
        public String apply(ValueClass l, ValueClass r) {
            return l.text + r.text;
        }
    }
);
leftFlux.join(
rightFlux,
新函数(){
@凌驾
公共出版商申请(价值类别v){
返回一些出版商;
}
},
新函数(){
@凌驾
公共出版商申请(价值类别v){
返回一些出版商;
}
},
新的双函数(){
公共字符串应用(ValueClass l,ValueClass r){
返回l.text+r.text;
}
}
);
发布者应该是哪些值类型(上面代码中的“某物”)?这些出版商应该创造哪些价值观


更新

即使在查看了反应堆堆芯中包含的(遗憾的是很少)测试用例之后,我仍然无法理解Flux.join是如何使用的。然而,我为我的案件找到了不同的解决办法。我构建了一个类,该类使用内部类订阅两个通量,将它们的项放入显式队列中,然后逐步处理,并通过DirectProcessor生成结果项