我正在阅读这个RxJava教程,并试图理解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
可以用计数或时间定义。 -
leftDurationSelector
和rightDurationSelector
返回什么类型的Observable
?这些名称表明它们应该与时间相关,但签名似乎允许任何类型的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在他的回答中建议的那样。然而,我仍然不知道如何存档这样的场景。如果有人能给出join
的另一个例子,而不使用timer
或interval
,那就太好了?
操作符将两个来源的值组合在一起:当左边的值触发时,左边的值将与当前打开的所有右边值组合在一起。对于相反的发射模式也是如此。
是否可以使用计数而不是持续时间连接两个序列?操作符窗口可以使用计数或时间来定义。
我不确定计数是什么意思,但你可以发表其中一个来源,并对它有一个看法:
left.publish(o -> o.join(right, lv -> o.take(5), rv -> ..., (a, b) -> a + b);
leftDurationSelector和rightDurationSelector返回什么类型的observable ?名称暗示它们应该是时间相关的,但签名似乎允许任何类型的Observable。
对于持续时间选择器,类型是什么或者发出什么值并不重要,因为第一个onNext或onCompleted将表示特定窗口的结束。因此,从某种意义上说,事件发射的时间很重要,但它不需要是interval()。