RxJava3 Kotlin使用flatMap后如何保留下游Pair<Customer, Profile>数据
解决方案:RxJava flatMap 保留原始 Pair 数据类型
你的问题核心是每个flatMap操作都丢弃了原始的Pair类型,转而返回了业务操作的Customer类型,导致下游无法再访问Profile数据。要解决这个问题,关键是在每个flatMap内部执行完业务逻辑后,始终返回Pair类型(要么复用原始Pair,要么用更新后的Customer和原始Profile重新构建Pair)。
修改后的代码如下:
override fun execute(): Single<Pair<Customer, Profile>> { return Single.fromObservable( graphQLProfileService.getCustomerProfile() ).map { Pair( it.mdc.toCustomer(), it.profile ) } // Single<Pair<Customer, Profile>> .flatMap { originalPair -> // 执行更新后,用新的Customer和原始Profile重新构建Pair updateProfileUseCase.execute(topsCustomer = originalPair.first) .map { updatedCustomer -> updatedCustomer to originalPair.second } } .flatMap { currentPair -> // 执行完用户更新后,返回当前的Pair updateUserUseCase.execute() .toSingleDefault(currentPair) } .flatMap { currentPair -> // 执行完APP更新后,返回当前的Pair updateAppUseCase.execute() .toSingleDefault(currentPair) } }
关键修改点说明:
第一个flatMap:
- 接收原始的
Pair<Customer, Profile>对象 - 执行
updateProfileUseCase得到更新后的Customer - 通过
map将更新后的Customer与原始Profile重新组成Pair,确保下游依然是Single<Pair<Customer, Profile>>
- 接收原始的
后续flatMap:
- 接收当前的Pair对象
- 执行业务操作(
updateUserUseCase/updateAppUseCase)后,用toSingleDefault(currentPair)直接返回原始Pair,保证类型不丢失
核心思路:
在RxJava的链式调用中,flatMap会将上游的类型替换为下游Observable/Single的类型。要保留原始数据,就需要在flatMap内部始终将业务操作的结果与原始数据绑定,或者在操作完成后直接返回原始数据,以此维持统一的输出类型。
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

