web-dev-qa-db-ja.com

RxJavaのオブジェクトのフィルターリスト

リストのプロパティに基づいてリストをフィルタリングしようとしています。たとえば、SensorsクラスにはisActiveプロパティがあり、isActiveを持つすべてのオブジェクトをtrueとして取得したいのですが、できません。さまざまな方法を試しましたが、解決策が見つかりませんでした。誰かが私を助けることができますか?

ここに私のコードがあります:

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

まず、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)
17
azizbekian

Kotlinユーザーは、以下のようなより単純なアプローチを使用できます。

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

Kotlin自体には非常に多くのリスト演算子があるため、フィルタリングの部分ではrxを使用する必要はありません。 it.filter {sensor -> sensor.isActive()}は純粋なKotlinコードです。

9
Reza A. Ahmadi

このコードは私のために働いています。

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
Anh Duy