RxJava - 如何从嵌套方法中获取 Single

RxJava - How to get Single from nested method

在我的 Presenter 中,我有一个方法可以从 DataHolder 获取一些列表:

disposable.add(dataHolder.getMonthOfAttractions(monthInAdvance)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableSingleObserver<Map<String, List<Attraction>>>() {
                @Override
                public void onSuccess(Map<String, List<Attraction>> stringListMap) {

                }

                @Override
                public void onError(Throwable e) {

                }
            }));

然后,在我的 DataHolder 中检查我的列表是否不为空。如果为真,return 是我的列表,如果为假,它会从服务器下载此列表:

public Single<Map<String, List<Attraction>>> getMonthOfAttractions(int monthInAdvance) {
    Map<String, List<Attraction>> monthOfAttractions = monthlyAttractionsMap.get(monthInAdvance);
    if (monthOfAttractions != null)
        return Single.fromCallable(() -> monthOfAttractions);
    else
        return apiGetMonthOfAttractions(monthInAdvance);

问题出在 apiGetMonthOfAttractions 方法上。我不知道如何正确实施此方法以 return 我的演示者的价值。

我试过类似的方法:

private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
    cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance)
            .subscribeWith(new CnkApiObserver<AttractionListResponse>() {
                @Override
                public void onSucceeded(AttractionListResponse result) {
                    result.getMonthOfAttractions();
                }

                @Override
                public void onFailed(Error error) {
                }
            });
}

但在这种情况下,我有 "missing return statement" 但我不知道如何实施它。我乞求学习 RxJava,所以要理解。

请帮忙:)

编辑: 这就是我的 Retrofit getAttractions() 方法的样子:

public interface CnkApiInterface {

@GET("pl/front-api/{dateFrom}/{dateTo}")
Single<AttractionListResponse> getAttractions(@Path("dateFrom") String dateFrom, @Path("dateTo") String dateTo);}

我只是尝试做类似的事情(这只取决于你的 cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance) returns)

private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
  return cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance)

}

应该可以解决问题

这就是你想要的:

private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
    return cnkRetrofitProvider.getApiInterface()
            .getAttractions(monthInAdvance)
            .flatMap(attractionListResponse -> Single.just(attractionListResponse.getMonthOfAttractions()));
}

你总是可以将结果映射到 List<Attraction> 所以@wojech_maciejewski 的答案仍然成立,你只需要添加一个映射函数。

private Single<Map<String, List<Attraction>>> apiGetMonthOfAttractions(int monthInAdvance) {
  return cnkRetrofitProvider.getApiInterface().getAttractions(monthInAdvance)
                            .map(atractions -> /* convert to List<Attraction> here */) 

}