Filter list of objects in RxJava

放肆的年华 提交于 2019-12-05 01:23:26

First, you need to emit each item from the List individually. That can be achieved using flatMap() and Observable.fromIterable(Iterable).

Then apply filter() operator. Lastly, collect all of those items into list again using toList().


    service.getSensorsList()
              .flatMap(Observable::fromIterable)
              .filter(sensor -> sensor.isActive())
              .toList()
              .subscribeOn(Schedulers.io())
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(this::handleSensors, this::handleError)

Kotlin users can use a more simple approach like below.

fcService.getStationList()
    .map(it.filter {sensor -> sensor.isActive()})

It is possible because Kotlin has so many list operators itself, so for the filtering part you don't have to use rx. it.filter {sensor -> sensor.isActive()} is pure Kotlin code.

This code is working for me.

import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.observers.DisposableSingleObserver
import io.reactivex.schedulers.Schedulers
import java.util.*
import javax.inject.Inject
import kotlin.collections.ArrayList

    class MainPresenter {
    ....

    var disposable: Disposable? = null
    fun filterArticlesList(text: String?) {
            if (text == null || text.isEmpty()) {
                LogDebug.d("filterArticlesList", "cleared text")
                staticArticlesListFiltered = staticArticlesList
                getView()?.onFilterListSuccess(staticArticlesListFiltered)
            } else {
                val locale = Locale.getDefault()
                val textLower = text.toLowerCase(locale)
                disposable?.dispose()
                disposable = (Observable.fromIterable(staticArticlesList)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .filter { article -> article.title.toLowerCase(locale).contains(textLower) }
                    .toList()
                    .subscribeWith(FilterObserver(this@MainPresenter)))
            }
        }

    }
    class FilterObserver(private val presenter: MainPresenter) :
        DisposableSingleObserver<List<Article>>() {
        override fun onSuccess(t: List<Article>) {
            LogDebug.d("FilterObserver", "onSuccess")
        }

        override fun onError(e: Throwable) {
            LogDebug.e("FilterObserver", "onError", e)
        }

    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!