Kotlin 和 RxJava2 zip 运算符 - None 以下函数可以使用提供的参数调用

Kotlin and RxJava2 zip operator - None of the following functions can be called with the arguments supplied

我在使用 Android Studio 3.0 IDE.

在 Kotlin 中编写 .zip Observable 时遇到问题

这是我的代码:

internal var updateStringEventsSubject = PublishSubject.create<String>()
internal var updateIntEventsSubject = PublishSubject.create<Int>()

internal var triggerSave = PublishSubject.create<Boolean>()
internal var triggerStopAndSave = PublishSubject.create<Boolean>()

internal var normalSaveTrigger = triggerSave.debounce(30, TimeUnit.SECONDS)
internal var trigger = Observable.merge(normalSaveTrigger, triggerStopAndSave)

private fun saveEvents(
        strings: List<String>,
        integers: List<Int>,
        someBoolean: Boolean): Boolean {

    return true //doesn't matter for now
}

fun temp() {
    Observable.zip<List<String>, List<Int>, Boolean, Boolean>(updateStringEventsSubject.buffer(trigger),
            updateIntEventsSubject.buffer(trigger),
            trigger, { strings: List<String>, integers: List<Int>, someBoolean: Boolean -> saveEvents(strings, integers, someBoolean) })
            .subscribe()
}

但是,我的 IDE(Android Studio 3.0 RC2) 在 .zip 运算符下划线并表示:

None of the following functions can be called with the arguments supplied. zip(((observer: Observer!>) → Unit)!, ((observer: Observer!>) → Unit)!, ((observer: Observer) → Unit)!, ((t1: List, t2: List, t3: Boolean) → Boolean)!)   where T1 = List, T2 = List, T3 = Boolean, R = Boolean for   fun zip(source1: ((observer: Observer) → Unit)!, source2: ((observer: Observer) → Unit)!, source3: ((observer: Observer) → Unit)!, zipper: ((t1: T1, t2: T2, t3: T3) → R)!): Observable! defined in io.reactivex.Observable zip(((observer: Observer!>) → Unit)!, ((observer: Observer!>) → Unit)!, ((t1: List, t2: List) → Boolean)!, Boolean)   where T1 = List, T2 = List, R = Boolean for   fun zip(source1: ((observer: Observer) → Unit)!, source2: ((observer: Observer) → Unit)!, zipper: ((t1: T1, t2: T2) → R)!, delayError: Boolean): Observable! defined in io.reactivex.Observable zip(ObservableSource!>!, ObservableSource!>!, ObservableSource!, io.reactivex.functions.Function3!, in List!, in Boolean!, out Boolean!>!)   where T1 = List, T2 = List, T3 = Boolean, R = Boolean for   fun zip(source1: ObservableSource!, source2: ObservableSource!, source3: ObservableSource!, zipper: Function3!): Observable! defined in io.reactivex.Observable zip(ObservableSource!>!, ObservableSource!>!, BiFunction!, in List!, out Boolean!>!, Boolean)   where T1 = List, T2 = List, R = Boolean for   fun zip(source1: ObservableSource!, source2: ObservableSource!, zipper: BiFunction!, delayError: Boolean): Observable! defined in io.reactivex.Observable

如何让它与 Kotlin 一起工作?

出于某种原因,使用 RxJava 1.1.7 它考虑将 zipper 参数的类型显式指定为 Func3 一个冗余的 SAM 构造函数(它是)并允许您用 lambda 替换它。然而,使用 RxJava 2.1.5 类型更改为 Function3 并且它不再将其识别为具有单个抽象方法的接口(它仍然是)。我不确定为什么会这样。

无论如何,指定拉链函数的类型就可以了:

import io.reactivex.functions.Function3
...

fun temp() {
    Observable.zip<List<String>, List<Int>, Boolean, Boolean>(updateStringEventsSubject.buffer(trigger),
            updateIntEventsSubject.buffer(trigger),
            trigger, Function3 { strings, integers, someBoolean -> saveEvents(strings, integers, someBoolean) } )
            .subscribe()
}

注意:我设法在没有为 Function3 显式指定类型参数的情况下让它工作。这可能取决于您使用的 Kotlin 或 RxJava 版本是否可以推断类型。如果不是,你总是可以更明确:

Function3<List<String>, List<Int>, Boolean, Boolean> { ... }

编辑: 还有一个更简单的方法:改用 io.reactivex.rxkotlin.Observables。这是一个内联函数,它为我们做了丑陋的类型声明。那么你可以这样做:

import io.reactivex.rxkotlin.Observables
...

Observables.zip(updateStringEventsSubject.buffer(trigger),
                updateIntEventsSubject.buffer(trigger),
                trigger, 
                ::saveEvents)

感谢@Joeleski,我发现了一个错误。在我的例子中,我 明确指定类型 zip 运算符的每个参数,然后发现一个变量的类型错误。

可能与谁有关....

我在尝试执行 Observable.merge()

时遇到了这个问题

解决方案是将其更改为 Observable.mergeArray()