Kotlin RxJava2结合最新

时间:2018-09-26 12:23:12

标签: android kotlin rx-java2

我有一个观测值列表,每个观测值返回一个字符串

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

科特琳告诉我以下任何功能都不能称为... 错误。 我看到了一些有关 SAM构造函数的帖子,但是在这里我明确指定了类型。 无法解决。

P.S。。解决方法是Function<Array<in String>, String>,然后results将是Array<Any>,而不是Array<String>

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

我已经调查了来源

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

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