如何对Reactor Flux流中的值求和?

时间:2018-02-27 21:19:35

标签: java reactive-programming project-reactor

假设我有一个包含findAll()方法的存储库,该方法返回Iterable State,其中State是表示具有两个字段的美国州的类( getter / setters):namepopulation

我想得到我的Flux中所有State s的总体字段。  我从Iterable创建一个Flux,如下所示:

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

我有我的Flux,但我不知道总结其价值的好方法。  我尝试过像

这样的东西
int total = 0;
f.map(s -> s.getPopulation()).subscribe(p -> total += v);
return total;

然而,编译器说总的“应该是最终的或有效的最终”。显然添加final是行不通的,因为我正在尝试添加它。

如何在Flux上进行求和(或任何其他聚合函数)?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

您可以从maven

导入reactor额外包

io.projectreactor.addons:reactor-extra

然后使用MathFlux.sumInt(integresFlux)
docs:https://projectreactor.io/docs/core/release/reference/#extra-math