リストのプロパティに基づいてリストをフィルタリングしようとしています。たとえば、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)
);
まず、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)
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)
}
}