Kotlin和RxJava2 zip运算符 - 使用提供的参数不能调用以下任何函数

时间:2017-10-24 22:12:51

标签: android-studio kotlin rx-java rx-java2 android-studio-3.0

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

  

使用提供的参数不能调用以下任何函数。   zip(((observer:Observer!&gt;)→Unit)!,((观察者:观察者!&gt;)→单位)!,((观察者:观察者)→单位)!,((t1:列表,t2:列表,t3:布尔)→布尔)))其中T1 = List,T2 = List,T3 =布尔,R =有趣的zip布尔值(source1:((观察者:观察者)→单位)!,源2 :((观察者:观察者)→单位)!,source3 :((观察者:观察者)→单位)!,拉链:((t1:T1,t2:T2,t3:T3)→R)!):可观察!在io.reactivex.Observable中定义   zip(((observer:Observer!&gt;)→Unit)!,((观察者:观察者!&gt;)→单位)!,((t1:列表,t2:列表)→布尔)!,布尔值)其中T1 = List,T2 = List,R =有趣的zip布尔值(source1:((观察者:观察者)→单位)!,source2:((观察者:观察者)→单位)!,拉链:((t1:T1,t2:T2 )→R)!, delayError:Boolean):可观察!在io.reactivex.Observable中定义   zip(ObservableSource!&gt;!,ObservableSource!&gt;!,ObservableSource!,io.reactivex.functions.Function3!,在List!中,布尔!,out布尔!&gt;!),其中T1 = List,T2 = List, T3 =布尔值,R =有趣的zip布尔值(source1:ObservableSource!,source2:ObservableSource!,source3:ObservableSource!,zipper:Function3!):可观察!在io.reactivex.Observable中定义   zip(ObservableSource!&gt;!,ObservableSource!&gt;!,BiFunction !,在List!中,out Boolean!&gt;!,Boolean),其中T1 = List,T2 = List,R =布局为有趣的zip(source1:ObservableSource! ,source2:ObservableSource!,zipper:BiFunction!,delayError:Boolean):可观察!在io.reactivex.Observable

中定义

如何让它与Kotlin一起使用?

3 个答案:

答案 0 :(得分:4)

由于某些原因使用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)

答案 1 :(得分:0)

感谢@Joeleski,我发现了一个错误。在我的情况下,我明确指定类型$s1="INSERT INTO `register_request` (`name`, `dob`, `email`, `mobile`, `address`, `gender`, `id_type`, `password`, `acc_type`, `acc_branch`, `trans_pin`, `open_bal`, `profile_pictures`) VALUES ('$fullName', '$dob', '$email', '$mobnum', '$fullAddress', '$gender', '$idtype', '$pass', '$atype', '$bnkb', '$transpin', '$aob', '$fileNameDb')"; $insert = $mydb->query($s1); if($insert){ echo 'success';} else{ echo 'error in database'; } 运算符的每个参数,然后发现一个变量的类型错误。

答案 2 :(得分:0)

可能关注的人......

尝试执行Observable.merge()

时遇到此问题

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