RxJava中的join运算符是否允许按计数指定窗口?

时间:2015-09-27 21:39:14

标签: rx-java

我正在阅读此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);
  1. 是否可以使用count而不是duration来连接两个序列?可以使用计数或时间来定义运算符window
  2. ObservableleftDurationSelector返回了哪种类型的rightDurationSelector?这些名称表明它们应该与时间相关,但签名似乎允许任何类型的Observable
  3. 编辑:我想我应该举例说明问题要更清楚: 假设我有2个序列:

    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中所建议的那样。但是,我仍然不知道如何存档这样的场景。如果有人可以在不使用jointimer的情况下提供interval的另一个例子,那会很棒吗?

1 个答案:

答案 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将发出特定窗口的结束信号。所以从某种意义上说,事件发生的时间很重要,但它不需要是一个区间()。