web-dev-qa-db-ja.com

Reactor Fluxストリームの値を合計するにはどうすればよいですか?

IterableStateを返すfindAll()メソッドを持つリポジトリがあるとします。ここでStateは、2つのフィールドを持つ米国の州を表すクラスです。 (ゲッター/セッター付き):name、およびpopulation

Flux内のすべてのStatesの人口フィールドの合計を取得したいと思います。次のように、IterableからFluxを作成します。

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

私はフラックスを持っていますが、その値を合計する良い方法がわかりません。私は次のようなことを試しました

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

ただし、コンパイラーは、合計は「最終的または事実上最終的である必要がある」と述べています。 finalを追加しようとしているので、追加しても明らかに機能しません。

Fluxで合計(またはその他の集計関数)を行うにはどうすればよいですか?

7
Mark

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
    }
10
mroman

Mavenからreactor追加パッケージをインポートできます

_io.projectreactor.addons:reactor-extra_

次に、MathFlux.sumInt(integresFlux)を使用します
docs: https://projectreactor.io/docs/core/release/reference/#extra-math

3
Slava