0

假设我有两个可观察的排序双精度数。我想将它们之间的区别作为可观察的。例如:

           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。

4

2 回答 2

3

这就是我在 rxjava 中的做法,这意味着两个 observables 具有相同的长度。

    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);
于 2017-01-03T20:25:41.923 回答
1

我认为 RxJava 中没有太多东西可以“实时”实现这种对称差异......主要是因为通用运算符无法做出您的初始假设(可观察值已排序),因此很少有人可以帮助您。

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

于 2017-01-05T13:07:19.947 回答