RxJava 中对象的过滤列表
Filter list of objects in RxJava
我正在尝试根据 属性 过滤列表。例如,Sensors class 有一个 属性 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));
首先,您需要从 List
中单独发出每个项目。这可以使用 flatMap()
and Observable.fromIterable(Iterable)
.
来实现
然后申请 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 用户可以使用如下更简单的方法。
fcService.getStationList()
.map(it.filter {sensor -> sensor.isActive()})
可能是因为Kotlin本身就有很多列表运算符,所以对于过滤部分你不必使用rx。 it.filter {sensor -> sensor.isActive()}
是纯 Kotlin 代码。
这段代码对我有用。
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)
}
}
我想删除基于 Rejex 的列表的值,最后 return 一个 Observable 列表模型
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())
}
希望对您有所帮助
我正在尝试根据 属性 过滤列表。例如,Sensors class 有一个 属性 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));
首先,您需要从 List
中单独发出每个项目。这可以使用 flatMap()
and Observable.fromIterable(Iterable)
.
然后申请 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 用户可以使用如下更简单的方法。
fcService.getStationList()
.map(it.filter {sensor -> sensor.isActive()})
可能是因为Kotlin本身就有很多列表运算符,所以对于过滤部分你不必使用rx。 it.filter {sensor -> sensor.isActive()}
是纯 Kotlin 代码。
这段代码对我有用。
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)
}
}
我想删除基于 Rejex 的列表的值,最后 return 一个 Observable 列表模型
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())
}
希望对您有所帮助