让我们说我有两个可观察的分类双打。我希望将它们之间的区别作为一种可观察的方式。例如:
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。
答案 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
获取灵感:它在内部逐步推进两个发布者之间以执行相等比较,因此接近您想要的要做。