如何从Mono获取字符串<;字符串>;在反应式java中

如何从Mono获取字符串<;字符串>;在反应式java中,java,lambda,functional-programming,reactive-programming,Java,Lambda,Functional Programming,Reactive Programming,我有一个接受Mono作为参数的方法。 我只想从中得到实际的字符串。谷歌搜索了一下,但除了在Mono对象上调用block()之外,没有找到答案,但它会发出阻塞调用,所以要避免使用block()。如果可能,请建议其他方式。 我之所以需要这个字符串,是因为在这个方法中,我需要用实际的字符串值调用另一个方法say print()。 我知道这很容易,但我对反应式编程还不熟悉 代码: 公共字符串getValue(单字符串){ //如何从param monoString获取实际字符串 //并调用print(S

我有一个接受Mono作为参数的方法。 我只想从中得到实际的字符串。谷歌搜索了一下,但除了在Mono对象上调用block()之外,没有找到答案,但它会发出阻塞调用,所以要避免使用block()。如果可能,请建议其他方式。 我之所以需要这个字符串,是因为在这个方法中,我需要用实际的字符串值调用另一个方法say print()。 我知道这很容易,但我对反应式编程还不熟悉

代码:

公共字符串getValue(单字符串){
//如何从param monoString获取实际字符串
//并调用print(String)方法
}
公共作废打印(字符串str){
系统输出打印项次(str);
}
根据您可以执行的操作:

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

注意阻塞调用

如果没有阻塞调用,从
单声道
获取
字符串
并不容易,这是不可能的。根据定义。如果
字符串
还不可用(这是
Mono
允许的),除非等待它出现,否则无法获得它,而这正是阻塞的含义

您订阅
Mono
而不是“获取
字符串”
,您通过的
订户将在
字符串可用时(可能立即)获取
字符串。例如


将打印由myMono产生的值或错误(
值的类型为
字符串,错误的类型为
可丢弃)。在,您还可以看到订阅的其他变体。

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

public void getValue(Mono<String> monoString)
{
   monoString.flatMap(this::print);
}
public void getValue(单字符串)
{
flatMap(this::print);
}

对我有效的方法如下:

monoString.subscribe(this::print)

更好

monoUser.map(User::getId) 
最简单的答案是:

 String returnVal = mono.block();
这应该行得通

String str = monoString.toProcessor().block();

你能给我解释一下Mono是什么吗?检查->如果你使用零持续时间的块(持续时间超时)-我知道块的用法,但因为它会发出阻塞调用,我不想使用它。没有别的办法吗?这就是我要找的->如何订阅?可以通过lambda吗?是的,这是一种选择。请参见编辑。但关键是你不能在你的问题中写
getValue
方法。。。假设monomymmono将“abc”作为实际字符串。有了这个字符串,我需要在这个方法中调用另一个方法,比如print(stringstr)。那么我该如何实现这一目标呢。。myMono.subscribe(value->print(value))?是的,正如我在示例中使用
控制台.out.println
所示。仅供参考,您不必创建自己的
print(String str)
方法并执行
this::print
,而只需执行
System.out::print
为什么这段代码会给我一个错误:“无法推断flatMap的类型参数(函数这给了我一个错误此答案是否提供了除Alexey Romanov之外的任何其他信息?虽然这可能回答了作者的问题,但它缺少一些解释词和/或到文档的链接。如果没有一些短语,原始代码片段不会很有帮助。您也可能会发现非常有帮助。请编辑您的答案-W什么是User、monoUser和getId?它们都不是原始问题。因此,您所尝试的只是解决一个假设的查询。我认为现在不赞成这样做,但它会阻止调用
 String returnVal = mono.block();
String str = monoString.toProcessor().block();