web-dev-qa-db-ja.com

春のwebfluxのthen、thenEmpty、thenMany、flatMapManyは何ですか?

春のwebfluxでのthenEmptyまたはthenManyの使用、およびflatMapManyFluxMonoの違いがわかりません。

10
Amr Khaled
  • flatMap vs flatMapMany

関数型プログラミングでは、flatMapはメソッドを持つ型と同じ型を返すため、_Mono<T>_の場合、flatMapMonoを返します。つまり、内側のPublisherからは1つの要素のみを出力できます(または切り捨てられます)。 _Mono#flatMap_が_Function<T, Mono<R>>_を取得するように強制しました。

結果として、複数の要素を放出する可能性のある、より恣意的なPublisherの代替が必要でした。したがって、Mono#flatMapMany(Function<T, Publisher<R>>)は_Flux<R>_を返します。

TL; DR:_Mono#flatMap_はasynchronousですが、1-to-1ソース内の要素の変換Mono、_Mono#flatMapMany_は1-to-N非同期変換用です(Flux#flatMapなど)。

  • thenthenEmptyおよびthenMany

thenXXXのすべてのMonoメソッドには共通のセマンティクスが1つあります。これらは、ソースonNextシグナルを無視し、完了シグナル(onCompleteおよびonError)、さまざまなオプションを使用してこの時点でシーケンスを続行します。結果として、これは返されるMonoのジェネリック型を変更する可能性があります:

  1. thenはソースターミナル信号を再生するだけで、_Mono<Void>_がonNextを通知しないことを示します。
  2. thenEmptyは、_Mono<Void>_を返すだけでなく、_Mono<Void>_をパラメーターとして受け取ります。これは、ソース完了信号、次に、2番目のemptyモノ完了信号の連結を表します。つまり、AとBの両方が順番に完了したときに完了し、データを送信しません。
  3. thenManyは、ソースが完了するまで待機してから、その_Publisher<R>_パラメーターからのすべての信号を再生し、ソースが完了するまで「一時停止」する_Flux<R>_を生成しますthen完了シグナルも再生する前に、提供されたパブリッシャーからmany要素を発行します。
24
Simon Baslé