Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RxJava进行分组移动平均_Java_Rx Java2 - Fatal编程技术网

使用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
            });