过滤RxJava

时间:2018-02-08 12:12:52

标签: android rx-java reactive-programming rx-java2 rx-android

我试图根据它的属性过滤列表。例如,Sensors类有一个属性isActive,我希望isActivetrue的所有对象,但我无法做到。我尝试了不同的方法,但我没有找到解决方案。有人可以帮我做吗?

这是我的代码:

mCompositeDisposable.add(
                fcService.getStationList()
                        .subscribeOn(Schedulers.io())
                        .flatMap( stations ->   {
                            return fcService.getSensorList(stations.get(0).getName().getOriginal());
                        })
                        .subscribe(this::handleSensors, this::handleError)
        );

4 个答案:

答案 0 :(得分:12)

首先,您需要单独从List发出每个项目。这可以使用flatMap()Observable.fromIterable(Iterable)来实现。

然后应用filter()运算符。最后,使用toList()再次将所有这些项目收集到列表中。


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

答案 1 :(得分:6)

科特琳用户可以使用以下更简单的方法。

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

这是可能的,因为Kotlin本身具有如此多的列表运算符,因此对于过滤部分,您不必使用rx。 it.filter {sensor -> sensor.isActive()}是纯Kotlin代码。

答案 2 :(得分:0)

此代码对我有用。

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)
        }

    }

答案 3 :(得分:0)

我想删除基于Rejex的列表的值,最后返回一个可观察的列表模型

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())

}

我希望这会有所帮助