Bakhtiar Hussain
Bakhtiar Hussain

Reputation: 19

Observable converted into kotlin - Issue

I have converted a few JAVA classes into Kotlin but I am getting Type Mismatch Error issue in Android Studio.

I am adding my code snippets along with the screenshot of the message in IDE for reference.

JAVA CODE

Disposable disposable = Observable.just(true)
.subscribeOn(Schedulers.io())
.flatMap((Function<Object, ObservableSource<?>>) o ->
    Observable.zip(mModel.getSubLocalitiesFromStores(storeType, storeVerified),
        mModel.getLocalitiesFromSubLocalities(),
        (subLocalities, localities) -> {
            mLocalities = localities;
            mSubLocalities = subLocalities;
            return true;
        }
        ))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(res -> {
    setUpLocalitySpinner(spinnerLocalities);
    setUpSubLocalitySpinner(spinnerSubLocalities);
});
compositeDisposable.add(disposable);

KOTLIN CODE

Observable.just(true)
.subscribeOn(Schedulers.io())
.flatMap({ o->
    Observable.zip<ArrayList<SubLocality>, ArrayList<Locality>, Boolean>(mModel!!.getSubLocalitiesFromStores(storeType, storeVerified),
        mModel!!.localitiesFromSubLocalities,
        { subLocalities, localities ->
            mLocalities = localities
            mSubLocalities = subLocalities
            true
        }
        )
} as Function<Any, ObservableSource<*>>)
.observeOn(AndroidSchedulers.mainThread())
.subscribe { res ->
    setUpLocalitySpinner(spinnerLocalities)
    setUpSubLocalitySpinner(spinnerSubLocalities)
}

Issue (IDE Warning)

enter image description here

Upvotes: 2

Views: 222

Answers (2)

Alberto S.
Alberto S.

Reputation: 7649

You have just a lambda function that can be anything. Sometimes, the type inference doesn't work 100%, so you have to help it a bit

I don't have an IDE right now, but I'd say that adding the type should be enough. Something like:

Observable.zip<...>(...,
    BiFunction { subLocalities, localities ->
        mLocalities = localities
        mSubLocalities = subLocalities
        true
    }
)

Just as a side note, beware that one of the cool things of RxJava is the functional approach. Nothing happens if you don't want to (i.e. you invoke subscribe()) and all the effects are confined in the Observable flow. These assignments

        mLocalities = localities
        mSubLocalities = subLocalities

are introducing side effects that may become hard to track bugs in a future

Upvotes: 1

zmunm
zmunm

Reputation: 436

if you want to use zipsmoothly at kotlin, you should add RxKotlin on your gradle

try Observables.zip. not Observable.zip

Upvotes: 0

Related Questions