我有很长一段时间致力于使一些 RxJava 代码更好地平均一些数据
I have a long time to stay at making some RxJava codes better to average some data
我有一个像下面的虚拟数据集
class Place {
userId,
price
}
也就是一些地方的集合。
用例:
有一个用户有userId和login。
如何计算等于userId的平均店面价格?
RxJava 很好,我已经尝试过 filter
和 toList
,但是它的性能不是很好。
Observable.fromIterable(places)
.subscribeOn(Schedulers.newThread())
.filter(new Predicate<Place>() {
@Override
public boolean test(Place place) throws Exception {
return place.userId == global.login.userId;
}
})
.toList()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<Place>>() {
@Override
public void accept(List<Place> filteredPlace) throws Exception {
//Here I have to use loop to do math-average, it is not nice to average.
}
});
如果 places
已经存在于内存中,您可以像这样重新排列评估:
Observable.just(places)
.subscribeOn(Schedulers.computation())
.map((Iterable<Place> list) -> {
double sum = 0.0;
int count = 0;
for (Place p : list) {
if (p.userId == global.login.userId) {
sum += p.price;
count++;
}
}
return sum / count;
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(average -> { /* display average */ });
如果 places
的序列随时间变得可用(通过 Observable
):
Observable<Place> places = ...
places
.observeOn(Schedulers.computation())
.filter((Place p) -> p.userId == global.login.userId)
.compose(o -> MathObservable.averageDouble(o.map(p -> p.price)))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(average -> { /* display average */ });
MathObservable
是 RxJava 2 Extensions 库的一部分。
我有一个像下面的虚拟数据集
class Place {
userId,
price
}
也就是一些地方的集合。
用例:
有一个用户有userId和login。
如何计算等于userId的平均店面价格?
RxJava 很好,我已经尝试过
filter
和toList
,但是它的性能不是很好。Observable.fromIterable(places) .subscribeOn(Schedulers.newThread()) .filter(new Predicate<Place>() { @Override public boolean test(Place place) throws Exception { return place.userId == global.login.userId; } }) .toList() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<List<Place>>() { @Override public void accept(List<Place> filteredPlace) throws Exception { //Here I have to use loop to do math-average, it is not nice to average. } });
如果 places
已经存在于内存中,您可以像这样重新排列评估:
Observable.just(places)
.subscribeOn(Schedulers.computation())
.map((Iterable<Place> list) -> {
double sum = 0.0;
int count = 0;
for (Place p : list) {
if (p.userId == global.login.userId) {
sum += p.price;
count++;
}
}
return sum / count;
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(average -> { /* display average */ });
如果 places
的序列随时间变得可用(通过 Observable
):
Observable<Place> places = ...
places
.observeOn(Schedulers.computation())
.filter((Place p) -> p.userId == global.login.userId)
.compose(o -> MathObservable.averageDouble(o.map(p -> p.price)))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(average -> { /* display average */ });
MathObservable
是 RxJava 2 Extensions 库的一部分。