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