代码之家  ›  专栏  ›  技术社区  ›  K.Os

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

  •  8
  • K.Os  · 技术社区  · 8 年前

    我在写作方面有问题。使用Android Studio 3.0 IDE在Kotlin中可以观察到zip。

    这是我的代码:

    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(((观察者:观察者!>)单位)!,((观察者:观察者!>)单位)!,((观察员:观察员)单位)!,((t1:列表,t2:列表,t3:布尔)布尔)!)其中T1=列表,T2=列表,T3=布尔值,R=布尔值(源1:((观察者:观察者)单位)!,来源2:((观察者:观察者)单位)!,来源3:((观察者:观察者)单位)!,拉链:((t1:t1,t2:t2,t3:t3)R)!):可观察!在io中定义。反应性X。可观察的 zip(((观察者:观察者!>)-单位)!,((观察者:观察者!>)-单位)!,((t1:List,t2:List)–布尔)!,Boolean)其中T1=List,T2=List,R=Boolean for the fun zip(source1:((observer:observer)–Unit)!,来源2:((观察者:观察者)–单位)!,拉链:((t1:t1,t2:t2)–R)!,delayError:布尔):可观察!在io中定义。反应性X。可观察的 zip(ObservaleSource!>!、ObservaleSource!>!、ObservaleSource!、io.reactivex.functions.Function3!、in List!、in Boolean!、out Boolean!>!)其中T1=List,T2=List,T3=Boolean,R=Boolean for fun zip(source1:observesource!,source2:observesource!,source3:observesource!,zip:Function3!):可观察!在io中定义。反应性X。可观察的 zip(ObservableSource!>!、ObservableSource!>!、BiFunction!、in-List!、out Boolean!>!、Boolean)其中T1=List,T2=List,R=Boolean for the fun zip(source1:ObservableSource!,source2:ObservableSource!,zipper:BiFunction!,delayError:Boolean):Observable!在io中定义。反应性X。可观察的

    3 回复  |  直到 8 年前
        1
  •  7
  •   Joeleski    7 年前

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

    无论如何,指定zipper函数的类型将实现以下目的:

    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)
    
        2
  •  0
  •   CoolMind    8 年前

    明确指定类型 到的每个参数 zip 运算符,然后发现一个变量的类型错误。

        3
  •  0
  •   Nick Kalpakis    7 年前

    可能与谁有关。。。。

    我在执行时遇到了这个问题 Observable.merge()

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