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