Android 要映射的rxJava转换列表

Android 要映射的rxJava转换列表,android,rx-java,Android,Rx Java,我已从REST端点返回列表。我需要将该列表分解为多个类别(类别是列表中每个条目中的一项)。单个类别将写入缓存,以便以后更快地查找 我不知道我是否可以.map()这些条目,并提供多个filter()或某种类型的case语句来将类别条目放入正确的bucket中 用rxJava实现这样的东西听起来合理吗 更新: 非工作版本 private Map<String, List<VideoMetadataInfoEntity>> buildCategories( Observable

我已从REST端点返回列表。我需要将该列表分解为多个类别(类别是列表中每个条目中的一项)。单个类别将写入缓存,以便以后更快地查找

我不知道我是否可以.map()这些条目,并提供多个filter()或某种类型的case语句来将类别条目放入正确的bucket中

用rxJava实现这样的东西听起来合理吗

更新: 非工作版本

private Map<String, List<VideoMetadataInfoEntity>> buildCategories( Observable<List<VideoMetadataInfoEntity>> videoList ) {

    Map<String, List<VideoMetadataInfoEntity>> categoryMap = new HashMap<>();
    videoList
            .flatMap( Observable::from )
            .subscribe( videoMetadataInfoEntity -> mapCategory(videoMetadataInfoEntity, categoryMap ) );

    Observable.just( categoryMap )
            .doOnNext( saveCategoriesToCacheAction );

    return categoryMap;
}
私有地图构建类别(可观察视频列表){
Map categoryMap=新HashMap();
视频列表
.flatMap(可观察::来自)
.subscribe(videoMetadataInfoEntity->mapCategory(videoMetadataInfoEntity,categoryMap));
可观察。仅(类别映射)
.doOnNext(saveCategoriesToCacheAction);
返回类别映射;
}
然而,这些按顺序触发,这是我的理解,第二个可观察对象没有发送任何saveCategoriesToCacheAction,因为它没有订阅第一个可观察对象的结果


我开始认为我应该修改缓存策略。列表将始终包含所有详细信息。该服务没有为我提供一个子集,我可以使用它列出清单,然后再调用它来获取完整的详细信息。它是一个项目的完整列表或完整详细信息。现在单独缓存每一个并将其缓存到自己的类别缓存中可能是更好的方法。我试图进行映射,以便此网络调用可以返回请求的类别,但后续调用将来自缓存,直到缓存过期并有新的网络调用刷新它。

RxJava更适合异步消息处理,但是,由于它也支持函数式编程原则,所以它可以用作穷人的流api。如果你使用java 8,考虑使用流来完成这个任务,但是当你问这个问题时,我假设你使用的是java 7。 要想做您想做的事情,您可以尝试(请原谅lambda,如果您不使用Retrolambda,请用匿名内部类替换它):

其中
groupItemInCategoryBucket
是包含switch语句或任何其他缓存项的方法


请注意,这相当于for循环,尽管在许多其他优秀语言中使用这种风格是惯用的,但许多Java开发人员在看到这段代码时可能会有点困惑。

通常可以使用groupBy操作符实现项的分组(有关它的更多信息,请访问)

Map groupedValues=新的HashMap(4);
可观测范围(1,20)
.groupBy(i->i%2,i->i)
.订阅(转到->{
List groupValues=new ArrayList();
groupedValues.put(go.getKey(),groupValues);
go.subscribe(t->add(t,groupValues));
});
工作原理:
  • 首先,observable发射第1项到第20项(这发生在
    范围
    方法中)
  • 然后根据它们各自的特性将其发射到不同的观测值 奇偶校验(
    groupBy
    method,在此方法之后进行操作)
  • 然后,您订阅分组的可观察对象,接收(在subscribers
    onNext
    中)包含分组项及其分组依据的键的单独可观察对象。
  • 记住订阅分组的观测值,或者如果您对它们的内容不感兴趣,则对它们发出
    take(0)
    ,以防止内存泄漏

    我不确定这是否是最有效的方法,并欢迎您提供有关此解决方案的一些信息。

    我的解决方案是:

    Observable.range(1, 20)
                .groupBy(number -> number % 2)
                .flatMap(groupedObservable -> groupedObservable.toList())
                .toMap(list -> list.get(0) % 2);
    
    因此,我有
    [{0=[2,4,6,8,10,12,14,16,18,20],1=[1,3,5,7,9,11,13,15,17,19]}]

    说明:

    • 范围(1,20)-创建一个可观测的,发射前二十个数字
    • groupBy(number->number%2)-创建一个可观察对象,该对象发出组可观察对象,其中每个组可观察对象包含使用分组函数分组的项目(这里是x%2)
    • flatMap(groupedObservable->groupedObservable.toList())-将每个组转换为一个可观察对象,以列表的形式发出其所有项
    • toMap(list->list.get(0)%2)-创建映射

    rx适用于需要并行执行任务的场合。这里的并行性在哪里?我使用的是retrolambda,它是java7。这将在android应用程序中实现。我要试试这个。我需要对各个类别执行一些其他任务,例如将其转储到磁盘和内存缓存中,这样就不会经常通过网络调用它。我希望我可以建立这个链干净,或通过其他订阅。在某些情况下,只需要列表,在其他情况下,需要类别组。诸如此类。谢谢,不客气。希望它会成功;如果没有,请更新您的问题,并提供有关您希望执行的其他操作的更详细信息,以便我的回答更有用。我更新了我的问题。我想我需要改变我的方法。第二个可观察对象没有订阅,所以它不会做任何事情。还可以尝试在第二个可观察对象上调用.subscribe()。
    Map<Integer, List<Integer>> groupedValues = new HashMap<>(4);
        Observable.range(1, 20)
                .groupBy(i -> i % 2, i -> i)
                .subscribe(go -> {
                    List<Integer> groupValues = new ArrayList<>();
                    groupedValues.put(go.getKey(), groupValues);
                    go.subscribe(t -> add(t, groupValues));
                });
    
    Observable.range(1, 20)
                .groupBy(number -> number % 2)
                .flatMap(groupedObservable -> groupedObservable.toList())
                .toMap(list -> list.get(0) % 2);