首页 > 解决方案 > 如何在 RxJava2 中的 groupBy 之后获取类中的原始元素?

问题描述

我有一个 JSON 元素列表。例如,每个 JSON 元素都表示为名为“Foo”的 Java 类。这个 Foo 类有其他字段,它们也是一个 Java 类。我正在尝试按 Bar id 对这些 Foo 元素进行分组,然后我想对分组的元素进行其他操作,例如过滤器、排序。

public class Foo {
    private int id;
    private Bar bar;
    private Baz baz;
    private int qty;
}

public class Bar {
    private int id;
    private String name;
}

public class Baz {
    private int id;
    private String type;
}

我尝试了类似的方法来查看 groupBy 操作后的结果,但它没有打印任何内容。但是,如果我提供简单的元素,如 String 或 Integer 而不是 Foo 并尝试使用相同的方法对它们进行分组,它就可以工作。

List<Foo> myInput = new ArrayList<>();
myInput.add(...);
myInput.add(...);
Observable.fromIterable(myInput)
                .groupBy(el -> el.getBar().getId())
                .concatMapSingle(Observable::toList)
                .subscribe(System.out::println);

此代码使用此输入并随后打印出分组元素:

Observable<String> animals = Observable.just(
                "Tiger", "Elephant", "Cat", "Chameleon", "Frog", "Fish", "Flamingo");

animals.groupBy(animal -> animal.charAt(0))
                .concatMapSingle(Observable::toList)
                .subscribe(System.out::println);

我想做的是这样的:

Observable.fromIterable(myInput)
                .filter(el -> el.getBaz().getType().equals("type1"))
                .groupBy(el -> el.getBar().getId())
                //.filter(...)
                //.sorted(...)

如何对元素进行分组并检索该分组元素并对其应用其他操作?您能否也稍微解释一下,以便我了解幕后发生的事情?

标签: javajsonreactive-programmingrx-java2reactivex

解决方案


来自以下文档Observable#groupBy

根据指定的标准对 ObservableSource 发出的项目进行分组,并将这些分组的项目作为 GroupedObservables 发出。

来自以下文档GroupedObservable

一个按key分组的Observable,可以通过getKey()获取其值。

因此,GroupedObservable是的子类,Observable因此您可以应用常用map的 , filter,flatMap等可用的运算符。

例如,如果您想对每个 eachqty的分组s 的 s 求和,您可以通过以下方式映射s :FooBarGroupedObservable

Observable.fromIterable(foos)
    .groupBy(foo -> foo.getBar().getId())
    .flatMapSingle(grouped -> grouped.map(foo -> foo.qty).reduce(0, Integer::sum))
    .subscribe(System.out::println);

推荐阅读