RxJava zipWith IDE ошибка в Котлине с помощью Android Studio 3.0
Я хочу создать наблюдаемый, который испускает некоторые элементы из и наблюдаемый, содержащий список объектов с интервалом наблюдаемого, так что элементы из первого наблюдаемого будут испускать с некоторой задержкой времени. Вот моя реализация:
val just1 = ArrayList<SomeClass1>()
заполнить некоторые пункты
fun populateJust1() {
just1.add(SomeClass1("23", 23))
just1.add(SomeClass1("24", 24))
just1.add(SomeClass1("25", 25))
}
populateJust1()
и zip с интервалом наблюдаемым
Observable.fromIterable(just1)
.zipWith(Observable.interval(2, TimeUnit.SECONDS)) { item: SomeClass1, interval: Long -> item }
.subscribe(Consumer<SomeClass1> { someClass1 -> Log.v("someClass1", someClass1.toString()) })
однако IDE, Android Studio 3.0 подчеркивает красным цветом оператор zipWith и говорит:
ни одна из следующих функций можно назвать аргументы. zipWith (((наблюдатель: наблюдатель) → единица)!, ((t1: SomeClass1, t2: Long) → R)!) где R не может быть выведено; U = Long for fun zipWith (other: ((observer: Observer) → Unit)!, молния: ((t1: SomeClass1, t2: U) → R)!): Наблюдаем! определено в io.реактивекс.Заметный zipWith (ObservableSource!, BiFunction!) где R не может быть выведено; U = Long! для удовольствия zipWith (другое: ObservableSource! застежки: BiFunction!): Наблюдаемые! определено в io.реактивекс.Заметный zipWith ((Mutable)Iterable!, BiFunction!) где U, R не может быть выведено для удовольствия zipWith (другое: (изменяемое)Iterable! застежки: BiFunction!): Наблюдаем! определено в io.реактивекс.Заметный zipWith ((Mutable)Iterable!, ((t1: SomeClass1, t2: Long) → R)!) где R не может быть выведено; U = Long for fun zipWith (other: (Mutable)Iterable!, молния: ((t1: SomeClass1, t2: U) → R)!): Наблюдаем! определено в Ио.реактивекс.Наблюдаемый
что не так? Я только что преобразовал этот код из класса Java, где все было правильно
2 ответов
Котлин не может вывести типы в этой zipWith
лямда.
использовать BiFunction
вместо лямда:
data class SomeClass(val a: String, val b: Int)
val list = listOf(SomeClass("1", 1), SomeClass("2", 2))
Observable
.fromIterable(list)
.zipWith(Observable.interval(2, TimeUnit.SECONDS),
BiFunction { item: SomeClass, _: Long -> item })
.subscribe { Log.v("someClass", it.toString())
вы также можете использовать RxKotlin это поставляется с некоторыми небольшими обертками, чтобы скрыть этот вид шума. Вот примеры для сингла.zipWith:
fun <T, U> Single<T>.zipWith(other: SingleSource<U>): Single<Pair<T,U>>
= zipWith(other, BiFunction { t, u -> Pair(t,u) })