如何链接多个RxJava的groupBy()方法,如groupBy()。groupBy()

鉴于input:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

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

预期产出:

 [[1, 3, 5], [2, 4], [6, 8, 10], [7, 9]] 

输出的顺序不受限制。

我现在使用以下方法:

 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是由我编写的,以简化代码。

但我不满意它,因为它还不够简短,只能简单地指出目标。

我期望的是如下:

 Observable.range(1, 10) .groupBy(n -> n % 2 == 0) .groupBy(n -> n > 5) .subscribe(...); 

现在我只能缩小到:

 Observable.range(1, 10) .lift(new OperatorGroupByGroup(n -> n % 2 == 0)) .lift(new OperatorGroupByGroup(n -> n > 5)) .subscribe(...); 

我仍然需要编写一个有点复杂的OperatorGroupByGroup类。 任何改善build议?

Solutions Collecting From Web of "如何链接多个RxJava的groupBy()方法,如groupBy()。groupBy()"

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

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

用法:

 git clone https://github.com/yongjhih/RxJava-GroupByTest.git ./gradlew execute 

但是由于我的OperatorGroupByGroup实现,我修改了testing代码:

  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)); }); 

我想有人会做得更好。

试着这样做。

 Observables.range(1,10) .groupBy( n -> n % 2 == 0) .flatMap( grp -> grp.groupBy( n -> n > 5).flatMap( grp2 -> grp2.toList())) .subscribe(...) 

我有两个我认为既简洁又优雅的build议。

第一:

 Observable.range(1, 10) .groupBy(n -> n % 2 == 0) .flatMap(g -> g.groupBy(n -> n > 5)) .subscribe(...); 

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

第二个需要声明一个简单的Key类,它可以保存你的条件的结果,并有适当的equals()实现。 换句话说,一Pair 。 那你可以这样做:

 Observable.range(1, 10) .groupBy(n -> new Key(n % 2 == 0, n > 5)) .subscribe(...); 

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