web-dev-qa-db-fra.com

Filtrer la liste des objets dans RxJava

J'essaie de filtrer la liste en fonction de sa propriété. Par exemple, la classe Sensors a une propriété isActive et je veux obtenir tous les objets avec isActive comme true mais je ne peux pas le faire. J'ai essayé différentes manières mais je n'ai pas trouvé la solution. Quelqu'un peut-il m'aider à le faire?

Voici mon code:

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

Tout d'abord, vous devez émettre chaque élément du List individuellement. Cela peut être réalisé en utilisant flatMap() et Observable.fromIterable(Iterable) .

Ensuite, appliquez l'opérateur filter() . Enfin, rassemblez tous ces éléments dans la liste à nouveau en utilisant 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 les utilisateurs peuvent utiliser une approche plus simple comme ci-dessous.

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

C'est possible parce que Kotlin a lui-même beaucoup d'opérateurs de liste, donc pour la partie filtrage, vous n'avez pas besoin d'utiliser rx. it.filter {sensor -> sensor.isActive()} est du code Kotlin pur.

9
Reza A. Ahmadi

Ce code fonctionne pour moi.

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