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 }
代码逻辑拆解:
- 列表转Observable流:
Observable.fromIterable(list)把输入的ID列表拆分为可逐个处理的数据流,让我们能对每个ID单独执行请求。 - 顺序处理请求:
concatMapSingle保证按输入ID的顺序依次执行getValue()请求,如果你不需要严格顺序,也可以改用flatMapSingle实现并行处理。 - 错误过滤规则:
onErrorResumeNext操作符专门捕获NotFoundException,返回Single.empty()来跳过这个无效条目;对于其他类型的错误(比如网络超时、服务异常),仍然会正常抛出,不会被无故忽略。 - 结果收集与转换:
toList()把所有成功返回的值汇总成一个List,最后toSingle()转换成方法要求的Single<List<String>>类型。 - 业务转换操作:在
map中调用mutate(),对每个成功获取到的值执行你需要的业务逻辑处理。
为什么能通过你的测试用例?
输入ID中的3会触发NotFoundException,对应的Single会返回空值,不会被计入最终结果;其余ID都能成功获取数据,最终收集的列表正好是["one", "two", "four", "five"],完全匹配测试用例的断言要求。
内容的提问来源于stack exchange,提问作者methodsignature
相关产品推荐
相关产品推荐

