将两个Observable的flatmap的lambda更改为两个Singles的flatmap时出错

时间:2018-01-14 14:37:43

标签: lambda functional-programming kotlin retrofit2 rx-java2

我想结合两个API请求的结果。最初我让它们返回Observable,但为了正确执行它,我猜应该是单一的响应。

以下是我最初的改造界面:

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>
}

我正在使用lambda:

将它们的结果组合在一起
    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无法推断出有趣的flatMap(mapper:((t:LocationResponse)→SingleSource!)!):单身!在io.reactivex.Single中定义   flatMap(Function!&gt;!)其中R无法推断出有趣的flatMap(mapper:Function!&gt;!):单身!在io.reactivex.Single中定义

如何解决?

1 个答案:

答案 0 :(得分:2)

没有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 ) } }) 方法。您必须映射到内部结果以使项目配对:

    int key = cvWaitKey(10);
    switch(key) {
        case 'x':
            break;
    }