最近、私は projectreactor.io (io.projectreactor:3.1.1)でSpring 5を試すことにしました。
誰かがこの関数を使用する最良のケースを知っていますか?それぞれを使用することの短所と長所、およびそれらをどこで使用する必要がありますか?
良い例が参考になります。
ここには、大きく異なる2つの演算子カテゴリがあります。
Flux
自体を処理する演算子transform
とcompose
はコードの相互化用ですオペレーターのチェーンを定期的に作成し、アプリケーションに共通のオペレーター使用パターンがある場合、compose
とtransform
を使用して、このコードを相互に関連付けるか、よりわかりやすい名前を付けることができます。
2つの違いはwhen相互に作用する演算子が適用されます:transform
はインスタンス化時にそれらを適用し、compose
はサブスクリプション時にそれらを適用します(動的な選択を可能にします)追加された演算子)。
詳細と例については、 参照ドキュメント を参照してください。
as
これは、コード全体を流暢なスタイルに保ちながら、Function
をFlux
全体に適用する便利なショートカットです。例としては、(javadocに示されているように)Mono
に変換しますが、ファクトリメソッドスタイルで実装されている外部演算子の支援にもなります。
取る reactor-addons
MathFlux
例えば、そして比較します:
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
を生成します。
リファレンスドキュメント で例を見つけるのは少し難しい
以下のプログラムを作成して、トランスフォームとコンポーズのコンセプトに頭を悩ませました。
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