java - 组合多个 Single 的最有效方法是什么> 成为单曲>?
- >?
问题描述
我有一个loadApplesById
接受 aAppleId
并返回 a的函数Single<List<Apple>>
。
在另一个函数中,loadApplesByIdList
我接受 aList<AppleId>
作为参数。对于其中的每个元素,我必须调用loadApplesById
. 也将loadApplesByIdList
返回一个Single<List<Apple>>
.
像这样的东西:
Single<List<Apple> loadApplesById(AppleId appleId)
{
// magic to create and load the apple list.
return the Single.just(AppleList);
}
Single<List<Apple> loadApplesByIdList(List<AppleId> appleIdList)
{
// My question how to create this function (?)
// Approach (1)
return Observable.from(appleIdList).flatMap(
appleId -> this.loadApplesById(id)
.toObservable())
.reduce(new ArrayList<>(), (List<Apple> a, List<Apple> b)
-> { a.addAll(b); return a; }).toSingle();
// Approach (2)
return Observable.from(appleIdList).flatMap(appleId -> loadApplesById(id)
.toObservable())
.toSingle();
}
虽然这两种方法都可以编译,但它们都不起作用。
如果有人花时间详细说明可以实现这一点的不同方法(使用 fold、reduce、flatMap、concatMap)等,那将是一个很好的学习课程。
解决方案
您必须展开每个单曲,将它们连接起来,然后再次收集它们:
Single<List<Apple>> allApples =
Observable.fromIterable(appleIdList)
.concatMap(appleId ->
loadApplesById(appleId)
.flattenAsObservable(list -> list)
)
.toList();
不过,您需要 RxJava 2。
推荐阅读
- sql - 在 Redshift sql 上对时间间隔进行分组
- mysql - MySQL 服务器:仅将一些数据库移动到另一个位置
- oracle - 与列匹配后需要获取给定字符串中的最大值
- python-2.7 - 使用 Google Cloud Platform 的简单任务队列:Google PubSub 的问题
- ios - 作为 TableView 数据源的 Swift 通用枚举
- javascript - 从 url 中删除特定字符串并重定向
- javascript - Javascript Mobile Swipe 只能使用一次
- oracle - 分区修剪问题
- tfs - TFS 2018 XAML 构建迁移
- php - /tmp 目录未在实时服务器上清理