You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
        }
}

关键修改点说明:

  1. 第一个flatMap:

    • 接收原始的Pair<Customer, Profile>对象
    • 执行updateProfileUseCase得到更新后的Customer
    • 通过map将更新后的Customer与原始Profile重新组成Pair,确保下游依然是Single<Pair<Customer, Profile>>
  2. 后续flatMap:

    • 接收当前的Pair对象
    • 执行业务操作(updateUserUseCase/updateAppUseCase)后,用toSingleDefault(currentPair)直接返回原始Pair,保证类型不丢失

核心思路:

在RxJava的链式调用中,flatMap会将上游的类型替换为下游Observable/Single的类型。要保留原始数据,就需要在flatMap内部始终将业务操作的结果与原始数据绑定,或者在操作完成后直接返回原始数据,以此维持统一的输出类型。

内容的提问来源于stack exchange,提问作者ant2009

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:46:13