【问题标题】:Kotlin RxJava2 combine latestKotlin RxJava2 结合最新
【发布时间】:2018-09-26 12:23:12
【问题描述】:

我有一个可观察的列表,每个都返回一个字符串

val list = listOf<Observable<String>>(
                Observable.fromCallable { "1" },
                Observable.fromCallable { "2" },
                Observable.fromCallable { "3" },
                Observable.fromCallable { "4" }
        )

我想合并它们。

    val result: Observable<String> = Observable.combineLatest(
            list,
            Function<Array<String>, String> { results ->
                var resultString = ""
                //combine
                resultString
            })

Kotlin 显示 以下函数都不能调用... 错误。 我看到了一些关于 SAM 构造函数 的帖子,但这里我明确指定了类型。 不知道怎么解决。

P.S. 解决方法是 Function&lt;Array&lt;in String&gt;, String&gt;,但随后 results 将是 Array&lt;Any&gt;,而不是 Array&lt;String&gt;

【问题讨论】:

  • 会推荐使用 RxKotlin github.com/ReactiveX/RxKotlin ...除此之外,它还有许多帮助方法来解决 SAM 歧义问题。
  • @JohnO'Reilly,但如果我不想要怎么办)
  • 这只是一个建议......你不必做任何你不想做的事情:)
  • 你试过没有类型说明吗? val 结果:Observable = Observable.combineLatest(list) { results -> "" }
  • @AndreyTurkovsky 是的,结果是 Array 在这种情况下

标签: android kotlin rx-java2


【解决方案1】:

您可以在 lambda 参数本身上指定类型,例如:

Observable.combineLatest(list, Function { results: Array<in String> ->
    ...
})

您可以通过删除 SAM 构造函数并将 lambda 从 combineLatest() 的参数列表中移出来进一步压缩内容,例如:

Observable.combineLatest(list) { results: Array<in String> ->
    ...
}

【讨论】:

    【解决方案2】:

    我已经查看了来源

    public static <T, R> Observable<R> combineLatest(Iterable<? extends ObservableSource<? extends T>> sources,
            Function<? super Object[], ? extends R> combiner) {
        return combineLatest(sources, combiner, bufferSize());
    }
    

    因为

    ? super Object[]
    

    我认为你必须使用

    Array <in String>
    

    关于结果 - 你可以使用

    Observable.combineLatest(
                list,
                Function<Array<in String>, String> { results ->
                    val resultList = results.map { it.toString() }
                    //combine
                    ...
                    results[0]
                })
    

    我还没有找到其他解决方案

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多