RxJava-groupBy,toMap和flatMap不能一起工作吗?

时间:2018-07-17 16:46:50

标签: java functional-programming rx-java reactive-programming rx-java2

我希望这个小例子打印出所有可被3整除的数字。

@Test
public void test() {
    Observable.range(1, 100)
            .groupBy(n -> n % 3)
            .toMap(g -> g.getKey())
            .flatMap(m ->  m.get(0))
            .subscribe(System.out::println);
}

println不会打印任何内容,我不知道为什么。

我将这个示例从一个更复杂的示例中简化了下来,我知道可以用另一种方式完成此操作,但是我需要这种方式,因为有更多的组需要在flatMap处进行操作。同时。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

使用方法filter(Predicate<? super T> predicate)而不是groupBy(..)来发出满足指定谓词的元素。

Observable.range(1, 100)
    .filter(n -> n % 3 == 0)
    .toMap(g -> g.getKey())
    .flatMap(m ->  m.get(0))
    .subscribe(System.out::println);

Java Stream-API的工作原理相同:

IntStream.range(1, 100).filter(n -> n%3 == 0).forEach(System.out::println);
// prints 3, 6, 9, 12... on the each line

答案 1 :(得分:0)

groupBy运算符将输入源项目映射到HashMap,最新值存储在键下。

引用文档:

If more than one source item maps to the same key, the HashMap will contain the latest of those items.

因此,在您的情况下,toMap运算符将输入序列转换为以下HashMap {0=99, 1=100, 2=98}

要过滤掉指定范围内所有3不可分割的数字,只需按照@Nikolas建议使用filter运算符即可。

答案 2 :(得分:0)

正如@akarnokd在上面的评论中所述,该示例适用于RxJava v1和v2的最新版本,但不适用于我们使用的版本(com.netflix.rxjava:rxjava-core:jar:0.16 .1(很古老)。可能是由于库本身存在错误。