首页 > 解决方案 > flatMap 和 flatMap single 用于分组的 observables

问题描述

我是 RxJava 的新手,并试图理解它。我有以下来源:

Observable<Employee> obs = Observable.just(
    new Employee(101, "Jim", 68_000, 4.2),
    new Employee(123, "Bill", 194_000, 6.7));  

obs.groupBy(e -> e.getRating())
   .flatMapSingle(e -> e.toMultimap(key -> e.getKey(), emp -> emp.getName()))
   .subscribe(System.out::println);
 

这种方法打印键和相关的值。
如果我做:

obs.groupBy(e -> e.getRating())
       .flatMapSingle(e -> e.toList())
       .subscribe(System.out::println);   

它似乎打印了与键关联的值列表。
但是具体是如何flatMapSingle工作的呢?有什么区别flatMap

标签: rx-javarx-java3

解决方案


从文档中:

Maps each element of the upstream {@code Flowable} into {@link SingleSource}s, subscribes to all of them
     * and merges their {@code onSuccess} values, in no particular order, into a single {@code Flowable} sequence.

在这两种情况下,它的工作方式相同。当你调用

flatMapSingle(e -> { // convert to some value})

您将“e”转换为 lambda 返回的值。在你的情况下,“e”是GroupedFlowable.

在第一种情况下,您将所有元素转换为包含条目(键,值)的映射,在第二种情况下,您将其转换为列表。 flatMapSingle()在这两种情况下,方法的工作方式相同。

您有不同的结果,因为您使用不同的实现Function作为flatMapSingle参数。

Function在您的情况下看起来像的参数e -> { .... }决定了如何处理源发出的元素的方式。


推荐阅读