How to get String from Mono in reactive ja

2019-02-13 20:22发布

I have a method which accepts Mono as a param. All I want is to get the actual String from it. Googled but didn't find answer except calling block() over Mono object but it will make a blocking call so want to avoid using block(). Please suggest other way if possible. The reason why I need this String is because inside this method I need to call another method say print() with the actual String value. I understand this is easy but I am new to reactive programming.

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条回答
Lonely孤独者°
2楼-- · 2019-02-13 20:42

Getting a String from a Mono<String> without a blocking call isn't easy, it's impossible. By definition. If the String isn't available yet (which Mono<String> allows), you can't get it except by waiting until it comes in and that's exactly what blocking is.

Instead of "getting a String" you subscribe to the Mono and the Subscriber you pass will get the String when it becomes available (maybe immediately). E.g.

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

will print the value or error produced by myMono (type of value is String, type of error is Throwable). At https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html you can see other variants of subscribe too.

查看更多
冷血范
3楼-- · 2019-02-13 20:43

What worked for me was the following:

monoString.subscribe(this::print);

查看更多
Bombasti
4楼-- · 2019-02-13 20:47

Better

monoUser.map(User::getId) 
查看更多
Lonely孤独者°
5楼-- · 2019-02-13 20:52

According to the doc you can do:

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

be aware of the blocking call

查看更多
孤傲高冷的网名
6楼-- · 2019-02-13 21:01

Finally what worked for me is calling flatMap method like below:

public void getValue(Mono<String> monoString)
{
   monoString.flatMap(this::print);
}
查看更多
登录 后发表回答