RxJava中的join操作符允许通过计数指定窗口吗?



我正在阅读这个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);
  1. 是否有可能使用计数而不是持续时间连接两个序列?操作符window可以用计数或时间定义。
  2. leftDurationSelectorrightDurationSelector返回什么类型的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的另一个例子,而不使用timerinterval,那就太好了?

操作符将两个来源的值组合在一起:当左边的值触发时,左边的值将与当前打开的所有右边值组合在一起。对于相反的发射模式也是如此。

是否可以使用计数而不是持续时间连接两个序列?操作符窗口可以使用计数或时间来定义。

我不确定计数是什么意思,但你可以发表其中一个来源,并对它有一个看法:

left.publish(o -> o.join(right, lv -> o.take(5), rv -> ..., (a, b) -> a + b);

leftDurationSelector和rightDurationSelector返回什么类型的observable ?名称暗示它们应该是时间相关的,但签名似乎允许任何类型的Observable。

对于持续时间选择器,类型是什么或者发出什么值并不重要,因为第一个onNext或onCompleted将表示特定窗口的结束。因此,从某种意义上说,事件发射的时间很重要,但它不需要是interval()。

相关内容

  • 没有找到相关文章

最新更新