Ошибка при смене лямбды для плоской карты из двух наблюдений на плоскую карту двух синглов

Я хочу объединить результаты двух запросов API. Первоначально я заставил их вернуться Observable, но для правильной работы я предполагаю, что ответ должен быть Single.

Вот мои первоначальные модификации:

interface RemoteGeocodingService { @GET("json") fun requestCityAddressByName( @Query("address") address: String ): Observable<LocationResponse> } interface RemoteWeatherService { @GET("{latitude},{longitude}") fun requestWeatherForCity( @Path("latitude") latitude: String, @Path("longitude") longitude: String ): Observable<WeatherResponse> } 

Я объединил их результаты, используя лямбда:

  override fun getWeather(cityName: String): Observable<WeatherDetailsDTO>? { return remoteWeatherDataSource.requestCityAddressByName(cityName) .flatMap({ responseFromServiceA -> remoteWeatherDataSource.requestWeatherForCity(responseFromServiceA.results[0].geometry.location.lat.toString(), responseFromServiceA.results[0].geometry.location.lng.toString()) }, { responseFromServiceA, responseFromServiceB -> TransformersDTO.transformToWeatherDetailsDTO(responseFromServiceA.results[0].formatted_address, responseFromServiceB) }) .retry() } 

Однако, когда я изменяю результат запроса для каждого метода интерфейса API для использования Single вместо Observable, я не могу это выполнить – я получаю ошибку в редакторе Android Studio IDE. Вот что я пробовал:

  override fun getWeather(cityName: String): Single<WeatherDetailsDTO> { return remoteWeatherDataSource.requestCityAddressByName(cityName) .flatMap({ responseFromServiceA: LocationResponse -> remoteWeatherDataSource.requestWeatherForCity(responseFromServiceA.results[0].geometry.location.lat.toString(), responseFromServiceA.results[0].geometry.location.lng.toString()) }, { responseFromServiceA: LocationResponse, responseFromServiceB: WeatherResponse -> TransformersDTO.transformToWeatherDetailsDTO(responseFromServiceA.results[0].formatted_address, responseFromServiceB) }) .retry() 

IDE указывает на ошибку оператора .flatMap и говорит:

Приведенные аргументы не могут быть вызваны ни одной из следующих функций. flatMap (((t: LocationResponse) → SingleSource!)!), где R не может быть выведено для fun FlatMap (mapper: ((t: LocationResponse) → SingleSource!): Single! определенная в io.reactivex.Single flatMap (Function!>!), где R не может быть выведено для fun flatMap (mapper: Function!>!): Single! определяется в io.reactivex.Single

Как это можно решить?

Не существует Single.flatMap(Function, BiFunction) . Вам нужно сопоставить внутренний результат, чтобы получить элементы в паре:

 remoteWeatherDataSource.requestCityAddressByName(cityName) .flatMap({ a: LocationResponse -> remoteWeatherDataSource.requestWeatherForCity( a.results[0].geometry.location.lat.toString(), a.results[0].geometry.location.lng.toString() ) .map { b: WeatherResponse -> TransformersDTO.transformToWeatherDetailsDTO( a.results[0].formatted_address, b ) } })