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
Java 如何对反应堆通量流中的值求和?_Java_Reactive Programming_Project Reactor - Fatal编程技术网

Java 如何对反应堆通量流中的值求和?

Java 如何对反应堆通量流中的值求和?,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,假设我有一个带有findAll()方法的存储库,该方法返回State的Iterable,其中State是一个表示美国州的类,它有两个字段(带getter/setter):name和population 我想得到通量中所有States的总体字段的总和。 我从Iterable创建一个通量,如下所示: Flux f = Flux.fromIterable(stateRepo.findAll()); 我有我的流量,但我不知道有什么好方法来总结它的价值。 我试过类似的方法 int total = 0;

假设我有一个带有
findAll()
方法的存储库,该方法返回
State
Iterable
,其中
State
是一个表示美国州的类,它有两个字段(带getter/setter):
name
population

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

Flux f = Flux.fromIterable(stateRepo.findAll());
我有我的流量,但我不知道有什么好方法来总结它的价值。 我试过类似的方法

int total = 0;
f.map(s -> s.getPopulation()).subscribe(p -> total += v);
return total;
然而,编译器说,总计“应该是最终的或实际上是最终的”。添加
final
显然不起作用,因为我正在尝试添加


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

使用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
    }
@GetMapping(“/populations”)
公共人口(){
返回通量.fromIterable(stateRepo.findAll())
.map(s->s.getPopulation())
.减少(0,(x1,x2)->x1+x2)
.map(this::someFunction);//这里可以处理和
}

您可以从maven导入反应堆额外包

io.projectreactor.addons:reactor extra

然后使用
MathFlux.sumInt(integresFlux)


医生:

谢谢。我或多或少同意这个答案。我发现如果创建通量的
Iterable
恰好是空的,那么我会得到一个NullPointerException。我通过使用
.reduce(0,(x1,x2)->x1+x2)
解决了这个问题,其中0 arg是聚合的初始值。另外,使用
block()
而不是
subscribe()
会导致返回聚合值。太好了。我建议避免在生产中使用块方法,因为你会阻止自己等待结果。如果您使用Spring Boot,并且需要处理这些总体,那么可以使用extra map方法进行处理,并返回Mono(减少后为Mono)作为控制器结果。示例:@GetMapping(“/populations”)公共Mono getPopulation(){Flux.fromIterable(stateRepo.findAll()).map(s->s.getPopulation()).reduce(0,(x1,x2)->x1+x2.map(this::someFunction);//这里可以处理总和}请注意,这是一种更通用的方法,可用于任何类型。你能详细介绍一下NPE吗?这听起来很奇怪。请注意,这是一种更专门的方法,适用于
数字