为了账号安全,请及时绑定邮箱和手机立即绑定

如何从反应堆核心中的 Mono<String> 中提取字符串

如何从反应堆核心中的 Mono<String> 中提取字符串

一只斗牛犬 2023-05-17 16:02:01
我Mono<String>在反应器中有一个对象。我怎样才能从这个对象中得到一个字符串值?我知道我可以做类似下面的事情:因为Mono<String> userName,我可以,userName.map(System.out::println).但这将直接打印值。我想将这个字符串值存储到另一个变量中,以便我可以将该变量传递给其他一些函数。我怎样才能提取这个值?
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

要以最简单的形式直接回答问题,您可以使用Mono.block().

但你几乎肯定不应该,因为这会阻塞线程,首先破坏了使用反应堆的意义。相反,您应该调用subscribe()并提供消费者。当发出一个值时,消费者将被异步调用Mono,该值作为参数。

当然,没有什么本质上可以阻止您将值分配给一个字段:

mono.subscribe(v -> this.value = v);

...但这在实践中的用处非常有限,因为您不知道该字段何时会被初始化。

正常的方法是一次性调用订阅者中的其他方法:

mono.subscribe(v -> {
    oneMethodThatNeedsTheValue(v);
    anotherMethodThatNeedsTheValue(v);
});

...或使用Mono.cache()并传递它:

class Test {


    void useMonoVal(Mono<String> mono) {

        mono.subscribe(s -> System.out.println("I need to see " + s));

    }


    void anotherMethod(Mono<String> mono) {

        mono.subscribe(s -> System.out.println("I need to talk to " + s));

    }


    public static void main(String[] args) {

        Mono myMono = Mono.just("Bob").cache();

        Test t = new Test();

        t.useMonoVal(myMono);

        t.anotherMethod(myMono);

    }


}

(该cache()方法确保Mono只评估一次,然后为所有未来的订阅者缓存,这在使用just()工厂时当然是无关紧要的,但只是为了一个完整的例子。)


扩展一下,使用反应式范式(因此反应器,并通过扩展它Mono和Flux对象)的全部意义在于它使您能够以非阻塞方式进行编码,这意味着当前的执行线程不会“被阻止” " 等待单声道发出一个值。


旁注:我不确定它是否与问题直接相关,但你不能这样做a.map(System.out::println);- 你可能是说a.subscribe(System.out::println);.


查看完整回答
反对 回复 2023-05-17
?
森林海

TA贡献2011条经验 获得超2个赞

在从单声道对象获取字符串之前,您必须订阅

public class MonoT {

        static String x = null;

        public static void main(String[] args) {

            // TODO Auto-generated method stub

            Mono<String> username = Mono.just("Naren");

            

            username.subscribe(v->{

                x = v;

            }); 

            

            System.out.println(x);

        }

    

    }


查看完整回答
反对 回复 2023-05-17
  • 2 回答
  • 0 关注
  • 303 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信