Rx android 我花了很长时间来改进一些RxJava代码,以平均一些数据
我收集了一些数据,如下面的dummyRx android 我花了很长时间来改进一些RxJava代码,以平均一些数据,rx-android,rx-java2,Rx Android,Rx Java2,我收集了一些数据,如下面的dummy class Place { userId, price } 这意味着一些地方的集合 用例: 有一个用户具有userId和登录名 如何计算等于userId的平均位置价格 RxJava很好,我尝试过过滤器和列表,但是它的性能不是很好 Observable.fromIterable(places) .subscribeOn(Schedulers.newThread()) .filter(new Pr
class Place {
userId,
price
}
这意味着一些地方的集合
用例:
过滤器
和列表
,但是它的性能不是很好
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.
}
});
Observable.fromIterable(位置)
.subscribeOn(Schedulers.newThread())
.filter(新谓词(){
@凌驾
公共布尔测试(Place)引发异常{
return place.userId==global.login.userId;
}
})
托利斯先生()
.observeOn(AndroidSchedulers.mainThread())
.订阅(新消费者){
@凌驾
public void accept(List filteredPlace)引发异常{
//在这里,我必须使用循环来做数学平均,平均是不好的。
}
});
如果
位置
是内存中已有的内容,则可以按如下方式重新安排计算:
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 */ });
MathObservable
是库的一部分。我认为您的第一个代码也是调用循环。你认为没有扩展就没有办法只写一行吗?RxJava是一个组合库,工具分布在它内部,有时也分布在它外部。通常情况下,没有一条线性规划可以解决一个非常重要的业务案例。因为您使用的是Android,所以无法直接访问Java Streams,任何Java Streams的后台端口都需要外部依赖。
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 */ });