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

Mono<String>在反应器中有一个对象。我怎样才能从这个对象中得到一个字符串值?

我知道我可以做类似下面的事情:因为Mono<String> userName,我可以,

userName.map(System.out::println).

但这将直接打印值。我想将这个字符串值存储到另一个变量中,以便我可以将该变量传递给其他一些函数。我怎样才能提取这个值?


一只斗牛犬
浏览 304回答 2
2回答

大话西游666

要以最简单的形式直接回答问题,您可以使用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);.

森林海

在从单声道对象获取字符串之前,您必须订阅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);        }        }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java