【问题标题】:Split an observable into overlapping groups then combine them将 observable 拆分为重叠的组,然后将它们组合起来
【发布时间】:2016-01-07 09:27:31
【问题描述】:

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

  • 条件集可能会改变
  • 每个元素可能属于零个、一个或多个组。这意味着这些组可以相互重叠。

例如,下面的代码将序列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&lt;Observable&lt;Integer&gt;&gt;
  2. 如何按特定顺序组合拆分组,例如join
  3. 是否有更好的解决方案?

【问题讨论】:

    标签: java reactive-programming rx-java reactivex


    【解决方案1】:

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

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

    话虽如此,您还提到源发出的项目可以出现在多个组中。使用flatMapgroupBy 之前实现这一点。例如数字 6 你可能会flatMapObservable.just(Multiple(2, 6), Multiple(3, 6)) 然后groupBy Multiple 的第一个元素。

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

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多