問題

次のコードは動作します:

 // emitting employees...
.flatMap(employee -> {

    boolean isAlive = employee.isAlive();

    return Mono.just(isAlive)

            .flatMap(myBoolean -> {
                if (myBoolean) {
                    return Mono.empty();
                } 
                else {
                    return Mono.just(employee);
                }
            });

})
 

しかし、なぜmyBooleanを処理するときに.mapを使用できないのか疑問に思っていました(nullを返すとNullPointerExceptionが返されます)

             .map(myBoolean -> {
                if (myBoolean) {
                    return null;
                } 
                else {
                    return employee;
                }
            });
 

私はmapflatMapについて理解していないと信じています

Java 8ストリームでは、mapflatMapの違いを理解しています(受け取った各項目について、mapは1を発行し、flatMapはNを発行します)

しかし、Reactorでは少し混乱しています。私は、mapflatMapの両方が受け取った各要素に対して1つの項目を発行すると考えました。違いは、mapMonoとして発行し、flatMapは発行しません。 N個の項目を発行するには、flatMapManyを使用します。

あなたの説明のために事前に感謝!

  ベストアンサー

Reactor java doc から

map:同期関数を適用して、このMonoによって放出された項目を変換します。

flatMap:このMonoによって放出された項目を非同期的に変換し、別のMonoによって放出された値を返します。

すべての場合、nullを返すことはできません。単に設計上禁止されています。 mapflatMapの主な違いは、2番目のものがMonoを返すことです。これにより、データベース、Webサービスなどの非同期呼び出しを実行できます。

したがって、flatMapを使用して別の非同期を実行する必要があります。 Mono.just(...)を返すとあまり役に立ちません。 flatMapを使用して、Mono.empty()をある条件で返すことができます。頻繁なパターンです。

条件付きの新しいオブジェクトを発行する別のコードを次に示します。

         .handle(myBoolean, sink -> {
            if (!myBoolean) {
                sink.next(employee);
            } // else the Mono would be empty ...
        });
 

  同じタグがついた質問を見る

javareactor