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

Я хочу объединить результаты двух запросов 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 ) } }) 
  • Функция для выражения лямбда
  • Kotlin и Jack не поддерживаются (Android Studio 2.3.2)
  • Как написать правильный генератор HTML в Котлине
  • «Лямбда с приемником»: что это за конструкция Котлин?
  • Как перегружать конструкторы в котлин отличается в лямбда-обратном типе
  • Kotlin: неоднозначность линейной лямбды и перегрузки
  • Android Kotlin не может использовать list.sort () с lambda
  • Непроверенный при бросании объекта типа Any? в лямбда в котлин
  • Котлин: лямбда никогда не компилируется
  • Котлинская лямбда с несколькими параметрами
  • Фильтрующий лямбда-фильтр Kotlin с использованием индекса итерации
  • Давайте будем гением компьютера.