RxJava:根据特定条件组合多个对象流

时间:2017-07-30 14:57:48

标签: java rx-java

我有多个通知来源:A,B,C(它们都产生不同类型的对象但具有一些共同的属性),当满足某个条件时,我希望将它组合成一个新的流。

Streams示例:

A: [ ObjectA(id=1), ObjectA(id=2), ObjectA(id=3), ObjectA(id=5), ObjectA(id=4)]
B: [ ObjectB(id=1), ObjectB(id=2), ObjectB(id=3), ObjectB(id=4), ObjectB(id=5)]
C: [ ObjectC(id=1), ObjectC(id=2), ObjectC(id=3), ObjectC(id=4), ObjectC(id=5)]

所需的输出:

Result: [ ObjectABC(id=1), ObjectABC(id=2), ObjectABC(id=3), ObjectA(id=4), ObjectA(id=5)]

当收到具有相同ID的ObjectABCObjectAObjectB时,将创建每个ObjectC并将其添加到结果流中。

如果找不到匹配项,则应该等到找到具有相同I + d的三元组。

在接收到的当前三元组项目不匹配的示例中(类似于第四次迭代A的第四项具有Id = 5),应该保留它直到处理来自其他流的匹配项目或一段时间后丢弃。

这是否可以通过RxJava实现。

1 个答案:

答案 0 :(得分:1)

我没有IDE,但这应该解释逻辑:

// First, extract all of the IDs as they arrive
final Observable<Integer> ids = as.map(i -> i.id).distinct();

// Then, for each ID, extract the ObjectA, ObjectB and ObjectC instances
// and zip them together. 
final Observable<ObjectABC> abcs = ids.flatMap(id -> Observable.zip(
    as.filter(a -> a.id.equals(id)).take(1), 
    bs.filter(b -> b.id.equals(id)).take(1), 
    cs.filter(c -> c.id.equals(id)).take(1),
    (a, b, c) -> new ObjectABC(a, b, c));

如果您想强制执行订购:

abcs.sort(Comparator.comparing(abc -> abc.id));