Filter list of objects in RxJava

后端 未结 4 1701
南方客
南方客 2021-02-13 07:00

I am trying to filter the list on the basis of it\'s property. For example, Sensors class has a property isActive and I want to get all the objects with isAct

相关标签:
4条回答
  • 2021-02-13 07:08

    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)
    
    
    0 讨论(0)
  • 2021-02-13 07:11

    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.

    0 讨论(0)
  • 2021-02-13 07:23

    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)
            }
    
        }
    
    0 讨论(0)
  • 2021-02-13 07:30

    I wanted to delete the values of a list based on Rejex and finally return a Observable list model

    fun getList(): Observable<List<Destination>> {
        return appDataBase.dao().getAllList().flatMap {
            Observable.fromIterable(it).filter { destination ->
                destination.number.matches(regex = "[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\s\\./0-9]*\$".toRegex())
            }.toList().toObservable()
        }.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
    
    }
    

    I hope this helps

    0 讨论(0)
提交回复
热议问题