web-dev-qa-db-ja.com

Mono = <String>からリアクティブjava

Monoをパラメーターとして受け入れるメソッドがあります。それから実際の文字列を取得するだけです。 GoogledがMonoオブジェクトでblock()を呼び出す以外は答えを見つけられませんでしたが、ブロッキング呼び出しを行いますしたがって、block()の使用を避けたいです。可能な場合は別の方法を提案してください。必要な理由この文字列は、このメソッド内で、実際の文字列値を使用してprint()などの別のメソッドを呼び出す必要があるためです。これは簡単だと理解していますが、リアクティブプログラミングは初めてです。

コード:

        public String getValue(Mono<String> monoString)
        {
        // How to get actual String from param monoString 
        //and call print(String) method
        }

        public void print(String str)
        {
         System.out.println(str);
        }
14
nanosoft

最後に私のために働いたのは以下のようなflatMapメソッドを呼び出すことです:

public void getValue(Mono<String> monoString)
{
   monoString.flatMap(this::print);
}
1
nanosoft

ブロッキング呼び出しなしでMono<String>からStringを取得するのは簡単ではありません。不可能です。定義により。 Stringがまだ利用できない場合(Mono<String>で許可されている場合)は、それが入るまで待ってそれを取得することはできません。

Stringを取得」する代わりに、subscribeMonoに渡し、渡したSubscriberは、利用可能になったときにStringを取得します。 (多分すぐに)。例えば。

myMono.subscribe(
  value -> Console.out.println(value), 
  error -> error.printStackTrace(), 
  () -> Console.out.println("completed without a value")
)

myMonoによって生成された値またはエラーを出力します(valueのタイプはStringerrorのタイプはThrowable)。 https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html では、subscribeの他のバリアントも確認できます。

14
Alexey Romanov

doc によると、次のことができます。

String getValue(Mono<String> mono) {
    return mono.block();
}

ブロッキングコールに注意してください

私のために働いたのは次のことでした:

monoString.subscribe(this::print);

0
AjayCodes

より良い

monoUser.map(User::getId) 
0