web-dev-qa-db-ja.com

FluxとMonoにおけるcompose()とtransform()とas()とmap()の比較

最近、私は projectreactor.io (io.projectreactor:3.1.1)でSpring 5を試すことにしました。

誰かがこの関数を使用する最良のケースを知っていますか?それぞれを使用することの短所と長所、およびそれらをどこで使用する必要がありますか?

良い例が参考になります。

13
Andrew Sasha

ここには、大きく異なる2つの演算子カテゴリがあります。

Flux自体を処理する演算子

transformcomposeはコードの相互化用です

オペレーターのチェーンを定期的に作成し、アプリケーションに共通のオペレーター使用パターンがある場合、composetransformを使用して、このコードを相互に関連付けるか、よりわかりやすい名前を付けることができます。

2つの違いはwhen相互に作用する演算子が適用されます:transformはインスタンス化時にそれらを適用し、composeはサブスクリプション時にそれらを適用します(動的な選択を可能にします)追加された演算子)。

詳細と例については、 参照ドキュメント を参照してください。

as

これは、コード全体を流暢なスタイルに保ちながら、FunctionFlux全体に適用する便利なショートカットです。例としては、(javadocに示されているように)Monoに変換しますが、ファクトリメソッドスタイルで実装されている外部演算子の支援にもなります。

取る reactor-addonsMathFlux例えば、そして比較します:

MathFlux.sumInt(Flux.range(1, 10)
                    .map(i -> i + 2)
                    .map(i -> i * 10))
        .map(isum -> "sum=" + isum);

に:

Flux.range(1, 10)
    .map(i -> i + 2)
    .map(i -> i * 10)
    .as(MathFlux::sumInt)
    .map(isum -> "sum=" + isum)

(これは、Kotlinとは異なり、Javaに拡張メソッドがないことを示すのに役立ちます:))

Fluxを通過するデータを処理する演算子

mapはすべてデータに関するものです。ソース内の各要素が利用可能になると、1-1変換関数が適用されます。

上記のMathFluxの例では、mapを連続して使用して元の整数に2を加算し、次にシーケンスの各数値に10を掛けて、最後に3回目に各合計からStringを生成します。

15
Simon Baslé

リファレンスドキュメント で例を見つけるのは少し難しい

以下のプログラムを作成して、トランスフォームとコンポーズのコンセプトに頭を悩ませました。

fnstatefull = flux -> {
                            Flux<String> f = flux.filter(color -> {
                                //only reds are allowed
                                return color.equalsIgnoreCase("red");   

                            });
                            //applies mapping 'toUpperCase' based on the external control 'toUpper'
                            if(toUpper) {
                                f= f.map(String::toUpperCase);
                            }
                            return f;
                        };

変換

演算子はフラックスのインスタンス化時に適用されます。

fnstatefullは、以下の両方のサブスクライバーで同じように動作します。

    Flux<String> f = Flux.just("red", "green", "blue");
    toUpper = false;
    f = f.transform(fnstatefull);
    toUpper = true;

    f.subscribe(op -> log.error("ONE>>>" + op));
    toUpper = false;
    f.subscribe(op -> log.error("TWO>>>" + op));

出力

ReactordemoApplication - ONE>>>red
ReactordemoApplication - TWO>>>red

作成

演算子はsubscription時にフラックスに適用されます。

fnstatefullは、以下のサブスクライバーごとに異なる動作をします。

    Flux<String> f = Flux.just("red", "green", "blue");
    toUpper = false;
    f = f.compose(fnstatefull);
    toUpper = true;

    f.subscribe(op -> log.error("ONE>>>" + op));
    toUpper = false;
    f.subscribe(op -> log.error("TWO>>>" + op));

出力

ReactordemoApplication - ONE>>>RED
ReactordemoApplication - TWO>>>red
2
Vasco