web-dev-qa-db-fra.com

Comment obtenir String de Mono <String> en java réactif

J'ai une méthode qui accepte Mono en tant que paramètre .. Tout ce que je veux, c'est en tirer la chaîne. Googlé mais n'a pas trouvé de réponse sauf en appelant block () sur l'objet Mono mais il passera un appel bloquant afin d'éviter d'utiliser block (). S'il vous plaît suggérer un autre moyen si possible. La raison pour laquelle j'ai besoin de cette chaîne est parce qu'à l'intérieur de cette méthode, j'ai besoin d'appeler une autre méthode avec print () avec la valeur réelle de la chaîne . Je comprends que c'est facile, mais je suis novice en programmation réactive.

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

Enfin, ce qui a fonctionné pour moi, c'est d'appeler la méthode flatMap comme ci-dessous:

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

Obtenir une String à partir d'un Mono<String> sans appel bloquant n'est pas facile, c'est impossible. Par définition. Si la String n'est pas encore disponible (ce que Mono<String> permet), vous ne pouvez l'obtenir que si vous attendez jusqu'à ce qu'il arrive et c'est exactement ce que le blocage est.

Au lieu de "recevoir une String", vous subscribe à la Mono et à la Subscriber que vous passez obtiendrez la String lorsqu'elle sera disponible (peut-être immédiatement). Par exemple.

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

affichera la valeur ou l'erreur générée par myMono (le type de value est String, le type de error est Throwable). Sur https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html , vous pouvez également voir d'autres variantes de subscribe.

14
Alexey Romanov

Selon le doc vous pouvez faire:

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

être conscient de l'appel bloquant