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()
我在使用 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()