【问题标题】:RxJava 2.0 and Kotlin Single.zip() with list of singlesRxJava 2.0 和 Kotlin Single.zip() 以及单曲列表
【发布时间】:2018-01-06 16:43:21
【问题描述】:

我有无法解决的问题。我正在尝试使用 Kotlin 将多个 Singles 压缩为一个,而我提供的第二个参数都不适合。

    fun getUserFriendsLocationsInBuckets(token: String) {
    roomDatabase.userFriendsDao().getUserFriendsDtosForToken(token).subscribe(
            { userFriends: List<UserFriendDTO> ->
                Single.zip(getLocationSingleForEveryUser(userFriends),
                        Function<Array<List<Location>>, List<Location>> { t: Array<List<Location>> -> listOf<Location>() })
            },
            { error: Throwable -> }
    )
}

private fun getLocationSingleForEveryUser(userFriends: List<UserFriendDTO>): List<Single<List<Location>>> =
        userFriends.map { serverRepository.locationEndpoint.getBucketedUserLocationsInLast24H(it.userFriendId) }

【问题讨论】:

  • 函数的Java定义为Function&lt;? super Object[], R&gt;,所以需要在Kotlin中表示Object[]
  • 我会尝试用 Java 编写这个文件,不使用 lambda,然后使用 Convert Java to Kotlin 将其转换为 Kotlin

标签: kotlin rx-java rx-kotlin


【解决方案1】:

问题在于,由于类型擦除,zipper 函数的参数类型是未知的。在zip的定义中可以看到:

public static <T, R> Single<R> zip(final Iterable<? extends SingleSource<? extends T>> sources, Function<? super Object[], ? extends R> zipper)

您必须使用 Any 作为数组的输入,然后将它们转换为您需要的任何内容:

roomDatabase.userFriendsDao().getUserFriendsDtosForToken(token).subscribe(
        { userFriends: List<UserFriendDTO> ->
            Single.zip(
                    getLocationSingleForEveryUser(userFriends),
                    Function<Array<Any>, List<Location>> { t: Array<Any> -> listOf<Location>() })
        },
        { error: Throwable -> }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2018-05-03
    相关资源
    最近更新 更多