如何创建两个已排序的observable之间差异的可观察值?

时间:2017-01-03 14:17:46

标签: rx-java reactive-programming observable reactivex rx-scala

让我们说我有两个可观察的分类双打。我希望将它们之间的区别作为一种可观察的方式。例如:

           1       2           4        
 left:   ──o───────o───────────o────/
           1    3  4   5
 right:  ──o────o──o───o───/
                   l2          r3   r5
 output: ──────────o───────────o────o─/

这方面的必要实施很简单:保留您尚未到达的一侧的项目清单,以及"发出"来自另一方的物品。

RFP领域的规范方法是什么?我特意使用RxScala。

2 个答案:

答案 0 :(得分:3)

这就是我在rxjava中的表现,暗示两个observable具有相同的长度。

    Observable<Integer> obs1 = Observable.just(1, 2, 4, 6);
    Observable<Integer> obs2 = Observable.just(1, 3, 4, 5);

    obs1.zipWith(obs2, (integer, integer2) -> {
        if (!Objects.equals(integer, integer2)) {
            return Observable.just(integer).concatWith(Observable.just(integer2));
        } else {
            return Observable.empty();
        }
    })
      .flatMap(observable -> observable)
      .sorted()
      .forEach(System.out::println);

修改

另一种方法是使用集合

    Observable<Integer> obs1 = Observable.just(1, 2, 4);
    Observable<Integer> obs2 = Observable.just(1, 3, 4, 5);


    obs1.mergeWith(obs2)
            .sorted()
            .reduce(new ArrayList<Integer>(), (integers, integer) -> {
                if (integers.contains(integer)) {
                    integers.remove(integer);
                } else {
                    integers.add(integer);
                }
                return integers;
            })
            .flatMapIterable(integers -> integers)
            .forEach(System.out::println);

答案 1 :(得分:1)

我认为RxJava中并没有太多“实时”做对称差异......主要是因为你的起始假设(可观察量被排序)不能由通用运算符制作,所以很少有人会帮助你这一点。

但是,您可以尝试为此目的编写自定义运算符,方法是从sequenceEqual获取灵感:它在内部逐步推进两个发布者之间以执行相等比较,因此接近您想要的要做。