首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何链接多个RxJava的groupBy()方法,比如groupBy().groupBy()

如何链接多个RxJava的groupBy()方法,比如groupBy().groupBy()
EN

Stack Overflow用户
提问于 2015-01-30 15:14:19
回答 3查看 8.8K关注 0票数 11

给定输入:

代码语言:javascript
复制
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

按奇数或偶数对数字进行分组,然后按小于或大于5进行分组。

预期输出:

代码语言:javascript
复制
[[1, 3, 5], [2, 4], [6, 8, 10], [7, 9]]

输出的顺序不受限制。

我现在使用以下方法:

代码语言:javascript
复制
Observable.range(1, 10)
    .groupBy(n -> n % 2 == 0)
    .flatMap((GroupedObservable<Boolean, Integer> g) -> {
        return Observable.just(g).flatMap(ObservableUtils.<Boolean, Integer>flatGroup()).groupBy(n -> n > 5);
    })
    .subscribe((final GroupedObservable<Boolean, Integer> g) -> {
        Observable.just(g).flatMap(ObservableUtils.<Boolean, Integer>flatGroup()).forEach(n -> println(g + ": " + n));
    });

请注意,ObservableUtils是我为简化代码而编写的。

但我对它并不满意,因为它仍然不够简短,不足以简单地指出目标。

我所期望的结果如下:

代码语言:javascript
复制
Observable.range(1, 10)
    .groupBy(n -> n % 2 == 0)
    .groupBy(n -> n > 5)
    .subscribe(...);

目前,我只能将其缩减为:

代码语言:javascript
复制
Observable.range(1, 10)
    .lift(new OperatorGroupByGroup(n -> n % 2 == 0))
    .lift(new OperatorGroupByGroup(n -> n > 5))
    .subscribe(...);

我仍然需要编写OperatorGroupByGroup类,这有点复杂。有什么改进的建议吗?

EN

回答 3

Stack Overflow用户

发布于 2016-05-27 21:00:02

试着这样做。

代码语言:javascript
复制
Observables.range(1,10)
  .groupBy( n -> n % 2 == 0)
  .flatMap( grp -> grp.groupBy( n -> n > 5).flatMap( grp2 -> grp2.toList()))
  .subscribe(...)
票数 4
EN

Stack Overflow用户

发布于 2015-01-31 01:44:30

我写了一个基于OperatorGroupBy的OperatorGroupByGroup示例:

https://github.com/yongjhih/RxJava-GroupByTest

用法:

代码语言:javascript
复制
git clone https://github.com/yongjhih/RxJava-GroupByTest.git
./gradlew execute

但由于我的OperatorGroupByGroup实现,我修改了测试代码:

代码语言:javascript
复制
    Observable.range(1, 10)
    .lift(new OperatorGroupByGroup<Integer, Boolean, Integer>(n -> n % 2 == 0))
    .lift(new OperatorGroupByGroup<GroupedObservable<Boolean, Integer>, Boolean, Integer>(n -> n > 5))
    .subscribe((final GroupedObservable<Boolean, Integer> g) -> {
        Observable.just(g).flatMap(ObservableUtils.<Boolean, Integer>flatGroup()).forEach(n -> println(g + ": " + n));
    });

我觉得有人会做得更好。

票数 2
EN

Stack Overflow用户

发布于 2016-05-28 04:48:14

我有两个建议,我认为这两个建议都很简洁和优雅。

首先:

代码语言:javascript
复制
Observable.range(1, 10)
    .groupBy(n -> n % 2 == 0)
    .flatMap(g -> g.groupBy(n -> n > 5))
    .subscribe(...);

这几乎和您的期望一样好,只需多一个.flatMap()。唯一的问题是?你丢了第一把钥匙,但我不确定你是否在用这些钥匙。

第二,需要声明一个简单的Key类,该类可以保存两个条件的结果并具有适当的equals()实现。换句话说,Pair。然后您可以执行以下操作:

代码语言:javascript
复制
Observable.range(1, 10)
    .groupBy(n -> new Key(n % 2 == 0, n > 5))
    .subscribe(...);

这有一个缺点,那就是可组合性较差,因为在同一个.groupBy()调用中有两个条件,而不是链式调用。这样做的好处是,如果需要的话,可以使用一个组合键来保存这两个条件的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28231000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档