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