1. 概要

リアクティブプログラミングでは、アイテムの大規模なコレクションの発行者がいる場合があります。 場合によっては、このパブリッシャーの消費者は、一度にすべてのアイテムを処理できない可能性があります。 したがって、消費者の処理速度に合わせて、各アイテムを非同期で公開する必要がある場合があります。

このチュートリアルでは、コレクションMonoコレクションのFluxに変換するいくつかの方法を検討します。アイテム。

2. 問題の説明

Reactive Streamsを使用する場合、 Publisher とその2つの実装、FluxMonoを使用します。 けれど単核症の一種です出版社タイプの0または1つのアイテムを放出できる T フラックス 0を放出することができます N タイプのアイテム T

私たちが持っているとしましょう単核症を開催している出版社単核症 >> —タイプのアイテムの反復可能なコレクション T 。 私たちの要件は、を使用して非同期でコレクションアイテムを生成することですフラックス

ここでは、上の演算子が必要であることがわかります単核症 >> この変換を実行できます。 まず、ストリームパブリッシャー Mono からコレクションアイテムを抽出し、Fluxとして非同期でアイテムを1つずつ生成します。

Monoパブリッシャーには、Monoを同期的に変換できるmap演算子と、Monoを非同期的に変換するためのflatMap演算子が含まれています。 また、これらの演算子は両方とも、出力として単一のアイテムを生成します。

でも、 モノを平坦化した後に多くのアイテムを生成するためのユースケース >、flatMapManyまたはflatMapIterableを使用できます

これらの演算子の使用方法を見てみましょう。

3. flatMapMany

StringのサンプルListから始めて、Monoパブリッシャーを作成しましょう。

private Mono<List<String>> monoOfList() {
    List<String> list = new ArrayList<>();
    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");

    return Mono.just(list);
}

The flatMapMany の総称演算子です単核症それは出版社。 応募しましょう flatMapMany 私たちのソリューションに:

private <T> Flux<T> monoTofluxUsingFlatMapMany(Mono<List<T>> monoList) {
    return monoList
      .flatMapMany(Flux::fromIterable)
      .log();
}

この場合、 flatMapMany を取る単核症リスト 、それを平らにし、作成しますフラックス使用している発行元フラックスオペレーター fromIterable。 私たちも使用しましたログ() ここで、生成された各要素をログに記録します。 したがって、これにより、「1」、「2」、「3」、「4」などの要素が1つずつ出力され、が終了します。

4. flatMapIterable

Stringの同じサンプルListについて、ここで flatMapIterable —カスタムビルドの演算子について説明します。

ここでは、リストからフラックスを明示的に作成する必要はありません。 リストを提供するだけで済みます。 この演算子は、その要素からFluxを暗黙的に作成します。 ソリューションにflatMapIterableを使用してみましょう。

private <T> Flux<T> monoTofluxUsingFlatMapIterable(Mono<List<T>> monoList) {
    return monoList
      .flatMapIterable(list -> list)
      .log();
}

ここで、 flatMapIterable は、MonoListを取得し、内部でその要素のFluxに変換します。 したがって、flatMapMany演算子と比較してより最適化されています。 これにより、同じ「1」、「2」、「3」、「4」が出力され、終了します

5. 結論

この記事では、変換するさまざまな方法について説明しました単核症 >> の中へフラックス演算子の使用 flatMapMany flatMapIterable 。 どちらも使いやすい演算子です。 flatMapMany はより一般的なパブリッシャーに役立ちますが、flatMapIterableはそのような目的に最適化されています。

いつものように、コード例はGitHub利用可能です。