将一个observable拆分成重叠的组,然后将它们组合起来

时间:2016-01-07 09:27:31

标签: java reactive-programming rx-java reactivex

给定一系列整数,我想根据一组条件将它分成不同的组:

  • 条件可能会发生变化
  • 每个元素可以属于零个,一个或多个组。这意味着这些群体可以相互重叠。

例如,下面的代码将序列1..12分成两组,分别为2和3的倍数:

    final Observable<Integer> divisors = Observable.just(2, 3, 4);
    Observable.range(1, 12)
            .flatMap(i -> divisors
                    .filter(divisor -> i % divisor == 0)
                    .map(divisor -> new Pair<>(divisor, i))
            )
            .groupBy(pair -> pair.fst)
            .subscribe(group -> group.subscribe(pair -> System.out.println("element: " + pair.snd + ", group: " + pair.fst), Throwable::printStackTrace));

输出:

element: 2, group: 2
element: 3, group: 3
element: 4, group: 2
element: 4, group: 4
element: 6, group: 2
element: 6, group: 3
element: 8, group: 2
element: 8, group: 4
element: 9, group: 3
element: 10, group: 2
element: 12, group: 2
element: 12, group: 3
element: 12, group: 4

我的问题是:

  1. 请注意,在上面的示例中,我们只有1个条件集divisors。如何在以后更新?我认为变化的变量自然可以被认为是一个热门的观察者。但在这种情况下,我不知道如何在第二个observable中使用热Observable<Observable<Integer>>
  2. 如何按特定顺序合并拆分组,例如join
  3. 这个问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

groupBy使用而言,正常模式是将其与flatMap结合使用:

o.groupBy(...)
 .flatMap(g -> g.whatever())

话虽如此,您还提到源发出的项目可以出现在多个组中。使用flatMap可以在groupBy之前完成此操作。例如,您可以flatMapObservable.just(Multiple(2, 6), Multiple(3, 6)),然后groupBy Multiple的第一个元素。

希望这对你来说已经足够了。