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

RxJava组合两个请求疑问:为何返回Integer列表及如何获取MapsItem列表

让我来帮你拆解这两个问题:

1. 为什么onSuccess返回的是List<Integer>?

问题出在你flatMap操作符的第二个参数上:

(indoorMap, uMap) -> Log.i(TAG, "MapsItem: " + new MapsItem(indoorMap, uMap))

Android的Log.i()方法的返回值是int类型(它会返回成功写入日志的字符总数)。当你调用toList()时,RxJava会收集这个flatMap输出的所有int值,最终就形成了List<Integer>,所以你的SingleObserver的泛型被自动推导成了这个类型,onSuccess也就拿到了List<Integer>。

2. 如何获取indoorMap与uMap组合而成的MapsItem列表?

你只需要调整flatMap的结果转换器,让它返回MapsItem实例,而不是Log.i的返回值,同时更新观察者的泛型即可。修改后的代码如下:

requestToServiceGetMaps(idVenue, accessToken)
    .flatMap(uMapsResponse -> Observable.just(uMapsResponse.getIndoorMaps()))
    .flatMapIterable(indoorMap -> indoorMap)
    .flatMap(
        indoorMap -> requestToServiceGetMapImageUrl(idVenue, indoorMap.getId(), accessToken),
        (indoorMap, uMap) -> {
            // 先完成日志打印,再返回组合好的MapsItem
            MapsItem mapsItem = new MapsItem(indoorMap, uMap);
            Log.i(TAG, "MapsItem: " + mapsItem);
            return mapsItem;
        }
    ).toList()
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new SingleObserver<List<MapsItem>>() {
        @Override
        public void onSubscribe(Disposable d) { }
        @Override
        public void onSuccess(List<MapsItem> mapsItems) {
            // 这里就能拿到你需要的MapsItem列表了
        }
        @Override
        public void onError(Throwable e) { }
    });

核心改动点:

  • 在flatMap的结果转换器中,先创建MapsItem实例,打印日志后返回这个实例
  • 将SingleObserver的泛型从List<Integer>改为List<MapsItem>,这样onSuccess就能接收正确的列表了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:04:28