RxJava- CombineLatest但只对一个Observable的发射开火?

时间:2015-07-08 19:45:25

标签: java reactive-programming rx-java

假设我有两个可以在任何时刻发出值的无限Observable。它们结合起来创建Observable<ProcessFileEvent>

Observable<Integer>  selectedFileId= ...
Observable<MouseClick> buttonClick = ...

Observable<ProcessFileEvent> `processFileEvent` = Observable.combineLatest(selectedFileId, buttonClick, (s,b) -> {
    //create ProcessFileEvent here
});

问题是我只希望processFileEvent在buttonClick发出内容时发出,而不是selectedFileId。这绝对不是用户在输入文件ID时所期望的行为,而是开始ProcessFileEvent。我如何组合,但仅在buttonClick发出时发出?

3 个答案:

答案 0 :(得分:14)

使用withLatestFrom

Observable<Integer>  selectedFileId= ...
Observable<MouseClick> buttonClick = ...

Observable<ProcessFileEvent> processFileEvent = buttonClick.withLatestFrom(selectedFieldId, (b,s) -> {
    //create ProcessFileEvent here
});

仅在第一个Observable buttonClick发出时才会发出。

答案 1 :(得分:3)

.distinctUntilChanged()对象上使用MouseClick。这样,您只会在MouseClick更改时获取活动。

创建一个同时包含fileIdmouseClick的小组:

static class FileMouseClick {
    final int fileId;
    final MouseClick mouseClick;

    FileMouseClick(int fileId, MouseClick mouseClick) {
        this.fileId = fileId;
        this.mouseClick = mouseClick;
    }
}

然后

Observable.combineLatest(selectedFileId, buttonClick, 
                         (s,b) -> new FileMouseClick(s,b))
    .distinctUntilChanged(f -> f.mouseClick)
    .map(toProcessFileEvent())

答案 2 :(得分:1)

您可以使用Observable.Join执行此操作。特别注意这一段:

  

但是,我该怎么做以确保这些窗口没有   重叠 - 这样,一旦产生第二个值,我将不再   看到第一个值?好吧,如果我们从中返回左序列   leftDurationSelector,可以做到这一点。但等等,当我们   返回leftDurationSelector左边的序列,它会尝试   创建另一个订阅,可能会引入副作用。   快速回答是发布和RefCount左侧序列。   如果我们这样做,结果看起来更像是这样。

left  |-0-1-2-3-4-5|
right |---A---B---C|
result|---1---3---5
          A   B   C

那个大理石图是你想要的,其中selectedFileId是左序列,buttonClick是正确的序列。