当前位置: 首页 > 知识库问答 >
问题:

如何求和Reactor通量流中的值?

经兴安
2023-03-14

假设我有一个具有findall()方法的存储库,该方法返回stateiterable,其中state是一个表示美国状态的类,它有两个字段(带有getter/setters):namepopulation

我想获得Flux中所有状态的填充字段之和。我从Iterable创建了一个Flux,如下所示:

Flux f = Flux.fromIterable(stateRepo.findAll());

我有我的通量,但我不知道一个好的方法来总结它的价值。我试过

int total = 0;
f.map(s -> s.getPopulation()).subscribe(p -> total += v);
return total;

然而,编译器说total“应该是最终的或有效的最终的”。添加final显然不会起作用,因为我正在尝试添加。

我如何对通量进行求和(或任何其他聚合函数)?

共有1个答案

子车超英
2023-03-14

使用reduce方法

@GetMapping("/populations")
    public Mono<Integer> getPopulation() {
        return Flux.fromIterable(stateRepo.findAll())
                .map(s -> s.getPopulation())
                .reduce(0, (x1, x2) -> x1 + x2)
                .map(this::someFunction); // here you can handle the sum
    }
 类似资料:
  • 使用阻塞运算符,我可以这样做:

  • 我试图实现从阻塞队列创建的Reactor通量,但不确定哪个操作符最适合我的用例? 我正在创建一个流式RESTendpoint,其中的响应是流量,需要不断从阻塞队列中发出消息,作为获取REST调用的响应。 我已经尝试过论坛和留档,只能找到从可迭代集合或响应数据源发起的Flux,但没有任何BlockingQueue的示例。

  • 问题内容: 我想要与此等同的流: 该代码实际上并未编译,因为无法将0分配给T类型,但是您可以理解。 问题答案: 这是另一种方法: (不过,总的来说,保罗的回答是减少装箱和拆箱。) 至于 一般而言 ,我认为没有比这更方便的方法了。 我们可以做这样的事情: 但是你总会过夏天。也是有问题的,因为它返回了。上面的方法为一个空的映射抛出一个异常,但是一个空的和应该为0。当然,我们也可以传递0:

  • 我想要一个流的等价物: 这段代码实际上并不编译,因为0不能分配给类型T,但您明白了。

  • 在Reactor Netty中,当通过向TCP通道发送数据时,任何发布服务器都可以工作。但是,如果不是简单的即时而是使用带有延迟元素的更复杂的flux,那么它就会停止正常工作。例如,如果我们使用这个hello world TCP echo服务器,它将按照预期工作: 但是,如果我们将更改为 那么我们将期望对于每一个接收到的项目,都将产生一个延迟一秒的输出。 但是,服务器的行为方式是,如果它在间隔期间

  • 我有一个通量和单值,我不知道如何组合它们,以便在通量的每一项中都有单值。 我正在尝试这种方法,但它不起作用: