Iterable
のState
を返すfindAll()
メソッドを持つリポジトリがあるとします。ここでState
は、2つのフィールドを持つ米国の州を表すクラスです。 (ゲッター/セッター付き):name
、およびpopulation
。
Flux内のすべてのState
sの人口フィールドの合計を取得したいと思います。次のように、IterableからFluxを作成します。
Flux f = Flux.fromIterable(stateRepo.findAll());
私はフラックスを持っていますが、その値を合計する良い方法がわかりません。私は次のようなことを試しました
int total = 0;
f.map(s -> s.getPopulation()).subscribe(p -> total += v);
return total;
ただし、コンパイラーは、合計は「最終的または事実上最終的である必要がある」と述べています。 final
を追加しようとしているので、追加しても明らかに機能しません。
Fluxで合計(またはその他の集計関数)を行うにはどうすればよいですか?
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
}
Mavenからreactor追加パッケージをインポートできます
_io.projectreactor.addons:reactor-extra
_
次に、MathFlux.sumInt(integresFlux)
を使用します
docs: https://projectreactor.io/docs/core/release/reference/#extra-math