如何从反应java中的Mono <String>获取String

nan*_*oft 7 java lambda functional-programming reactive-programming

我有一个接受Mono作为参数的方法.我想要的只是从中获取实际的String.谷歌搜索,但没有找到答案,除了在Mono对象上调用block(),但它会进行阻塞调用,所以想避免使用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);
        }
Run Code Online (Sandbox Code Playgroud)

Ale*_*nov 20

String从一个Mono<String>没有阻塞的电话获得一个并不容易,这是不可能的.根据定义.如果String尚未提供(Mono<String>允许),除非等到它进入,否则你无法获得它,而这正是阻塞所在.

而不是"得到一个String"你subscribeMonoSubscriber你通过将获得String当它(立即也许)变为可用.例如

myMono.subscribe(
  value -> Console.out.println(value), 
  error -> error.printStackTrace(), 
  () -> Console.out.println("completed without a value")
)
Run Code Online (Sandbox Code Playgroud)

将打印由myMono(类型为valueis String,type of erroris Throwable)产生的值或错误.在https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html,您也可以看到其他变体subscribe.


ΦXo*_*a ツ 12

根据文档你可以这样做:

String getValue(Mono<String> mono) {
    return mono.block();
}
Run Code Online (Sandbox Code Playgroud)

注意阻塞调用

  • 我知道块的用法,但因为它会进行阻塞调用,所以我不想使用它。难道就没有别的办法了吗? (3认同)

nan*_*oft 9

最后对我有用的是调用 flatMap 方法,如下所示:

public void getValue(Mono<String> monoString)
{
   monoString.flatMap(this::print);
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,您可以简单地执行“System.out::print”,而不是创建自己的“print(String str)”方法并执行“this::print” (8认同)