it-roy-ru.com

Как получить строку из Mono <String> в реактивном java

У меня есть метод, который принимает Mono в качестве параметра. Все, что я хочу, это получить реальную строку из нее. Гуглил, но не нашел ответа, кроме вызова block () над объектом Mono, но он сделает блокирующий вызов поэтому хочу избегать использования block (). Пожалуйста, предложите другой способ, если это возможно. Причина, по которой мне нужно это String потому что внутри этого метода мне нужно вызвать другой метод скажем print () с фактическим значением String. Я понимаю, что это легко, но я новичок в реактивном программировании.

Код:

        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

Наконец, у меня получилось вызвать метод flatMap, как показано ниже:

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

Получить String из Mono<String> без блокирующего вызова нелегко, невозможно. По определению. Если String еще не доступен (что позволяет Mono<String>), вы не можете получить его, кроме как дождавшись, пока он не придет, и это именно то, что такое блокировка.

Вместо «получения String» вы subscribe для Mono и Subscriber, который вы передадите, получат String, когда он станет доступным (возможно, сразу). Например.

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

напечатает значение или ошибку, вызванную myMono (тип value равен String, тип error равен 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();
}

знать о блокирующем вызове

3
ΦXocę 웃 Пepeúpa ツ

То, что работало для меня, было следующим:

monoString.subscribe(this::print);

0
AjayCodes