Kotlin和RxJava2 zip运算符 – 以下函数都不能用提供的参数调用

我在使用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运算符,并说:

所提供的参数都不能调用以下函数。 ((观察者:观察者!>)→单位)!,((观察者:观察者!>)→单位)!,((观察者:观察者)→单位)!,((t1:列表,t2:列表,t3 :(观察者:观察者)→单元)!,源2:((观察者:观察者)→布尔)→布尔)!)其中T1 =列表,T2 =列表,T3 =布尔,R = ((t1:T1,t2:T2,t3:T3)→R)!):可观察的!单元)!,源3:((观察者:观察者)→单元)!,拉链: ((观察者:观察者!>)→单位)!,((观察者:观察者!>)→单位)!,((t1:列表,t2:列表)→布尔)!,定义在io.reactivex.Observable zip中。 ((观察者:观察者)→单位)!,源2:((观察者:观察者)→单位)!,拉链:((t1: T1,t2:T2)→R)!, delayError:Boolean):可观测! 定义在io.reactivex.Observable zip(ObservableSource!> !, ObservableSource!> !, ObservableSource !, io.reactivex.functions.Function3 !,在列表中,在布尔!,在布尔!>!)其中T1 =列表, T2 = List,T3 = Boolean,R =布尔值为乐趣zip(source1:ObservableSource!,source2:ObservableSource !, source3:ObservableSource!,zipper:Function3!):Observable! 定义在io.reactivex.Observable zip(ObservableSource!> !, ObservableSource!>!,BiFunction !,在List !, outBoolean!> !,布尔值)中,其中T1 = List,T2 = List,R = source1:ObservableSource!,source2:ObservableSource!,zipper:BiFunction !, delayError:Boolean):可观察! 在io.reactivex.Observable中定义

如何使它与Kotlin一起工作?

出于某种原因使用RxJava 1.1.7,它考虑明确指定拉链参数的类型作为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> { ... }