【问题标题】:To take a String from a Flux<String> throws type mismatch: Cannot convert from Disposable to String从 Flux<String> 中获取字符串会引发类型不匹配:无法从 Disposable 转换为 String
【发布时间】:2021-03-05 12:31:59
【问题描述】:

与this question to take a string from a Mono 相关,我想我终于知道如何从Flux&lt;String&gt; 中取出String,如下所示:

Flux<String> rates = controller.getRate(json);          
String myRate = rates.next().subscribe(System.out::print);

但是,这会导致类型不匹配 cannot convert from Disposable to String

我做错了什么?

澄清一下,这是为了测试 - 我需要一个内部字符串值。因此,如果我有一个 Flux&lt;String&gt; 的字符串:one、two、three,那么我想将另一个字符串设置为值 one

String s = ...

如果我尝试

String s = rates.doOnNext(System.out::print);

然后我得到一个type mismatch: cannot convert from Flux&lt;String&gt; to String

如果我尝试

String s = next().flatMap(System.out::print);

然后我得到一个type mismatch: cannot convert from Mono&lt;Object&gt; to String

【问题讨论】:

  • Flux::subscribe 返回一个不是字符串的一次性用品。
  • String s = rates.doOnNext(System.out::print).blockFirst(); 有效,但它不是反应性的。

标签: project-reactor


【解决方案1】:

我做错了什么?

目前尚不清楚您要达到什么目标,但这里可能有几件事:

  • Flux&lt;String&gt; 返回一个由 0..n 个字符串组成的流,您肯定只想要它返回的第一个(next() 就是这样做的?)
  • 实际上,您有两种选择从发布者获取值 - 您可以通过使用反应链异步执行,或者您可以阻塞线程直到它完成,然后直接获取它。 (请注意,如果您阻止,您将失去响应式框架为您提供的所有优势,因此这实际上是您想要做的事情很少见。)在此示例中,您看起来像是在订阅,但是 也试图阻止,这没有任何意义 - 你需要选择一个或另一个。
  • 如果您不想想要阻止并且您正在使用像 webflux 这样的响应式框架,那么订阅通常是框架的工作 - 您只需将您的响应式调用传递到链上,直到您最终在(例如)您的控制器方法上返回了Mono 或Flux。 (订阅只有在您不使用框架并且自己管理整个反应链 + 事件循环时才真正有效。)
  • 如果您不想阻止但想确保值在发出后立即打印出来(称为副作用),那么您可以使用doOnNext(System.out::print) 作为反应链的一部分来实现这个。

【讨论】:

  • 谢谢 - 我要做的就是将 Flux 中 next() 的字符串值分配给另一个字符串变量。没有阻挡!
  • 每次更新,如果我尝试doOnNext(System.out::print),我会得到类型不匹配。
  • @rupweb 你不能在不阻塞的情况下将值分配给“正常”字符串变量 - 这就是你可能会遇到困难的地方。作为反应链的一部分,你必须使用它,并用它做任何你想做的事情。当您尝试将其分配到其他地方并等待结果完成时,您正在阻塞(根据定义)。
  • 谢谢...String s = rates.doOnNext(System.out::print).blockFirst(); 用于测试目的,尽管我更愿意通过subscribe 查找字符串值。也许this 可能是一种方法?
  • 那里的方法只是获得一个未来,然后调用get() - 这只是用不同的名称阻止。您可以订阅,然后分配给订阅者中的某个字段 - 但在大多数情况下,这样做的用处有限,因为您不知道值何时更新。
猜你喜欢
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多