使用RxJava进行分组移动平均
我可以轻松计算简单整数列表的移动平均值,如:使用RxJava进行分组移动平均,java,rx-java2,Java,Rx Java2,我可以轻松计算简单整数列表的移动平均值,如: Integer arr[] = {1, 2, 3, 4, 5, 6}; Observable<Integer> oi = Observable.from(arr); oi.buffer(24, 1).subscribe(x -> average(x)) 其中,我希望以非阻塞方式(即,我从rabbitmq获得一个连续流)基于key分组
Integer arr[] = {1, 2, 3, 4, 5, 6};
Observable<Integer> oi = Observable.from(arr);
oi.buffer(24, 1).subscribe(x -> average(x))
其中,我希望以非阻塞方式(即,我从rabbitmq获得一个连续流)基于key
分组并计算移动平均值,该方式将发出{key->average}
值
我知道groupBy
操作符,但当我使用它时,事情变得一团糟。使用groupBy
执行此操作的最佳方法是什么?您可以执行以下操作:
Observable<Model> oi = ...;
oi.groupBy(model -> model.key)
.flatMapSingle(Observable::toList)
.subscribe(modelsGrouped -> { // key: modelsGrouped.get(0).key
double avg = average(modelsGrouped);
//...
});
可观测oi=。。。;
oi.groupBy(模型->模型键)
.flatMapSingle(可观察::toList)
.subscribe(modelsgroup->{//key:modelsgroup.get(0).key
双平均值=平均值(模型分组);
//...
});
希望有帮助 我对这个问题的理解是,有一个无限的流,目标是计算流上滑动窗口的平均值。但问题的细节并不清楚,有几种不同的解释方法
CASE 1. The sliding window is the most recent 24 items of the stream.
CASE 2. The sliding window is the most recent 24 items per type.
CASE 2.1 Each emit is the average of the most recent sliding window that has moved.
CASE 2.2 Each emit should contain averages of all groups.
CASE 2.3 Or some other forms..
如果您能给我们提供示例输入和预期输出,这将非常有帮助
以下答案适用于案例2.1:
oi.groupBy(model -> model.key) // [1]
.flatMap(groupedO -> groupedO.buffer(4, 1) // [2]
.map(list -> {
double avg = list.stream().mapToDouble(m -> m.value)
.average().orElse(0.0);
return new Model(list.get(0).key, avg); // [3]
}))
.subscribe(result -> { //[4]
// do something
});
buffer
应用于分组的可观察对象模型(组、平均值)
我想你可以使用groupBy操作符:@Héctor抱歉,我不清楚。我真的想知道如何使用groupBy运营商。谢谢!我认为
.flatMapSingle(Observable::toList)
正在阻塞(即等待流完成),因为它从未到达打印行。还有其他方法吗?我想那是最好的方法。你说从未到达打印行是什么意思?
我在那里设置了一个断点,但由于某种原因它从未到达那里它在我的机器中工作。你能展示你的代码吗?您是如何创建可观察的
?这是因为您有未完成的源代码(PublishSubject),对其调用onComplete(),它就会工作。如果它不知道源何时停止,它应该如何对元素进行分组。
oi.groupBy(model -> model.key) // [1]
.flatMap(groupedO -> groupedO.buffer(4, 1) // [2]
.map(list -> {
double avg = list.stream().mapToDouble(m -> m.value)
.average().orElse(0.0);
return new Model(list.get(0).key, avg); // [3]
}))
.subscribe(result -> { //[4]
// do something
});