假设我有两个可以在任何时刻发出值的无限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
发出时发出?
答案 0 :(得分:14)
Observable<Integer> selectedFileId= ...
Observable<MouseClick> buttonClick = ...
Observable<ProcessFileEvent> processFileEvent = buttonClick.withLatestFrom(selectedFieldId, (b,s) -> {
//create ProcessFileEvent here
});
仅在第一个Observable
buttonClick
发出时才会发出。
答案 1 :(得分: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;
}
}
然后
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是正确的序列。