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

RxJava实现错误过滤:处理Single类型的查找失败场景

解决方案:RxJava中跳过特定错误并收集成功结果

我明白你的需求——遍历一组ID发起远程请求时,遇到对应数据不存在的错误(也就是这里的NotFoundException)要跳过该条目,最终收集所有成功获取到的数据。下面是实现getStream()方法的具体方案,完全能满足你的测试用例要求:

fun getStream(list: List<Int>): Single<List<String>> {
    return Observable.fromIterable(list)
        // 按输入ID的顺序逐个处理请求,保证结果顺序与输入一致
        .concatMapSingle { id ->
            getValue(id)
                // 对成功获取到的值执行业务转换操作
                .map { mutate(it) }
                // 仅捕获NotFoundException并跳过该失败项,其他错误正常抛出
                .onErrorResumeNext { throwable ->
                    if (throwable is NotFoundException) {
                        Single.empty()
                    } else {
                        Single.error(throwable)
                    }
                }
        }
        // 收集所有成功返回的值为List
        .toList()
        // 转换为Single<List<String>>类型返回
        .toSingle()
}

// 示例mutate方法(可根据你的实际业务需求自定义逻辑)
fun mutate(value: String): String {
    // 这里可以添加比如格式转换、字段拼接等业务操作
    return value
}

代码逻辑拆解:

  1. 列表转Observable流:Observable.fromIterable(list)把输入的ID列表拆分为可逐个处理的数据流,让我们能对每个ID单独执行请求。
  2. 顺序处理请求:concatMapSingle保证按输入ID的顺序依次执行getValue()请求,如果你不需要严格顺序,也可以改用flatMapSingle实现并行处理。
  3. 错误过滤规则:onErrorResumeNext操作符专门捕获NotFoundException,返回Single.empty()来跳过这个无效条目;对于其他类型的错误(比如网络超时、服务异常),仍然会正常抛出,不会被无故忽略。
  4. 结果收集与转换:toList()把所有成功返回的值汇总成一个List,最后toSingle()转换成方法要求的Single<List<String>>类型。
  5. 业务转换操作:在map中调用mutate(),对每个成功获取到的值执行你需要的业务逻辑处理。

为什么能通过你的测试用例?

输入ID中的3会触发NotFoundException,对应的Single会返回空值,不会被计入最终结果;其余ID都能成功获取数据,最终收集的列表正好是["one", "two", "four", "five"],完全匹配测试用例的断言要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:54:40