wake-up-neo.com

So erhalten Sie String aus Mono <String> in reaktivem Java

Ich habe eine Methode, die Mono als Parameter akzeptiert. Alles, was ich will, ist, den eigentlichen String daraus zu erhalten. Googled, fand aber keine Antwort außer Aufruf von block () über das Mono-Objekt, aber es wird ein Blockierungsaufruf ausgeführt, daher sollte block () nicht verwendet werden. Bitte schlagen Sie einen anderen Weg vor, wenn möglich. .__ Der Grund, warum ich diesen String brauche, liegt darin, dass ich innerhalb dieser Methode eine andere Methode aufrufen muss, sagen Sie print () mit dem tatsächlichen String-Wert.

Code:

        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);
        }
5
nanosoft

Zum Schluss hat es für mich funktioniert, die flatMap-Methode wie folgt aufzurufen:

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

Es ist nicht einfach, eine String aus einem Mono<String> ohne einen blockierenden Aufruf zu erhalten. Per Definition. Wenn die Variable String noch nicht verfügbar ist (was Mono<String> erlaubt), können Sie sie nur erhalten, wenn Sie warten, bis sie hereinkommt.

Anstatt "eine String" zu erhalten, erhalten Sie subscribe für die Mono und die Subscriber, die Sie übergeben, die String, sobald sie verfügbar wird (möglicherweise sofort). Z.B.

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

gibt den von myMono erzeugten Wert oder Fehler aus (der Typ von value ist String, der Typ von error ist Throwable). Unter https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html können Sie auch andere Varianten von subscribe sehen.

14
Alexey Romanov

Entsprechend der doc können Sie Folgendes tun:

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

beachten Sie den Sperranruf

Was bei mir funktioniert hat war folgendes:

monoString.subscribe(this::print);

0
AjayCodes