Kotlin RxJava2 объединить последние - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть список наблюдаемых, каждая возвращает, скажем, строку

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 конструкторе , но здесь я явно указал типы.Не могу понять, как решить.

PS Обходной путь - Function<Array<in String>, String>, но тогда results будет Array<Any>, но не Array<String>.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Я искал источники

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

Я не нашел других решений

0 голосов
/ 26 сентября 2018

вы можете указать тип самого лямбда-параметра, например:

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

, вы можете дополнительно сжать вещи, удалив конструктор SAM и переместив лямбду из списка аргументов для combineLatest(), например,:

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