RxJava- CombineLatest但是只有一个Observable的发射?

tmn*_*tmn 11 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
});
Run Code Online (Sandbox Code Playgroud)

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

pau*_*els 14

用途withLatestFrom:

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

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

它仅在第一次Observable buttonClick发射时发出.


Dav*_*ten 3

用在物体.distinctUntilChanged()MouseClick。这样你只会在MouseClick发生变化时收到事件。

创建一个包含fileId和 的类mouseClick

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

    FileMouseClick(int fileId, MouseClick mouseClick) {
        this.fileId = fileId;
        this.mouseClick = mouseClick;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

Observable.combineLatest(selectedFileId, buttonClick, 
                         (s,b) -> new FileMouseClick(s,b))
    .distinctUntilChanged(f -> f.mouseClick)
    .map(toProcessFileEvent())
Run Code Online (Sandbox Code Playgroud)