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