我正在阅读此RxJava Tutorial并尝试了解join
运算符。它的签名如下:
public final <TRight,TLeftDuration,TRightDuration,R> Observable<R> join(
Observable<TRight> right,
Func1<T,Observable<TLeftDuration>> leftDurationSelector,
Func1<TRight,Observable<TRightDuration>> rightDurationSelector,
Func2<T,TRight,R> resultSelector)
以下是这个例子:
Observable<String> left =
Observable.interval(100, TimeUnit.MILLISECONDS)
.map(i -> "L" + i);
Observable<String> right =
Observable.interval(100, TimeUnit.MILLISECONDS)
.map(i -> "R" + i);
left
.join(
right,
i -> Observable.timer(150, TimeUnit.MILLISECONDS),
i -> Observable.timer(0, TimeUnit.MILLISECONDS),
(l,r) -> l + " - " + r
)
.take(10)
.subscribe(System.out::println);
window
。Observable
和leftDurationSelector
返回了哪种类型的rightDurationSelector
?这些名称表明它们应该与时间相关,但签名似乎允许任何类型的Observable
。0-1-2-3-4-5-6-7-8-9-|
0---2---4---6---8---|
我希望将它们加入到两侧的2个元素的窗口中,窗口会像这样移动:
[0]-
[0]-
[0-1]-
[0]---
0[1-2]-
[0---2]-
0-1[2-3]-
[0---2]---
0-1[2-3]-
[0---2]---
0-1-2[3-4]-
0--[2---4]-
0-1-2[3-4]-
0--[2---4]-
0-1-2-3[4-5]-
0--[2---4]-
0-1-2-3-4[5-6]-
0---2--[4---6]-
...
EDIT2:我上面的例子确实暗示了排放的时间,就像@akarnokd在his answer中所建议的那样。但是,我仍然不知道如何存档这样的场景。如果有人可以在不使用join
或timer
的情况下提供interval
的另一个例子,那会很棒吗?
答案 0 :(得分:1)
运算符组合来自两个源的值:每当左侧触发时,左侧值与所有当前打开的右侧值组合。对于相反的射击模式也是如此。
是否可以使用count而不是duration来连接两个序列?可以使用计数或时间来定义操作员窗口。
我不确定计算是什么意思,但您可以发布其中一个来源并对其进行处理:
left.publish(o -> o.join(right, lv -> o.take(5), rv -> ..., (a, b) -> a + b);
leftDurationSelector和rightDurationSelector返回什么类型的Observable?这些名字表明它们应该与时间有关,但签名似乎允许任何类型的Observable。
通过持续时间选择器,类型是什么或发出什么值并不重要,因为第一个onNext或onCompleted将发出特定窗口的结束信号。所以从某种意义上说,事件发生的时间很重要,但它不需要是一个区间()。