【问题标题】:How to combine List<Mono<String>> in a big String?如何将 List<Mono<String>> 组合成一个大字符串?
【发布时间】:2019-06-20 08:59:49
【问题描述】:

我创建了一个字符串单声道列表List&lt;Mono&lt;String&gt;&gt; myList。现在我需要将它们连接成一个大字符串。

当我初始化 StringBuilder 并异步更新它时,可能会返回空行。

//method body....

StringBuilder builder = new StringBuilder();

myList.forEach {
    mono ->
    mono.map{ str -> builder.append(str)}
}

return builder.toString() //<- is ""

如何让构建器等待单声道?

【问题讨论】:

  • 首先将List&lt;Mono&lt;String&gt;&gt; 转换为Mono&lt;List&lt;String&gt;&gt;stackoverflow.com/questions/53231537/…
  • @AndyTurner 我可以结合 Flux。但我不知道这是否让我的生活更轻松
  • 我认为问题远不止于此。您似乎不了解 Mono/Flux 的两个关键概念。 1:它们代表异步数据流。 2. 在您订阅之前什么都不会发生。我建议你阅读 reactor 的用户指南。您订阅 Mono/FLux 以使其开始发出事件,并且只有在发出某些内容时才会通知您稍后。所以,不订阅 Monos 并希望立即有结果,是两件没有多大意义的事情。 projectreactor.io/docs/core/release/reference/index.html
  • @JBNizet 您的评论不包含任何答案,并对我的能力做出毫无根据的假设
  • 这不是空穴来风。我只是查看了您提交的代码:它从不订阅,并且假设您可以立即获得结果,而不会阻塞。所以合乎逻辑的结论是你错过了关键概念,因此我的评论是为了解释你错在哪里,以及如何处理它。评论不是答案。

标签: java spring-boot project-reactor


【解决方案1】:

最好的方法是将 Monos List 转换为 Flux,然后将 Flux 减少到一个包含所有子字符串的字符串。然后你就有了 Mono ,你仍然可以以异步方式使用它。 (如果您想与项目反应器保持异步范式,则应始终使用 Mono/Flux)

例子:

    List<Mono<String>> listOfMonosWithString = Arrays.asList(Mono.just("a"), Mono.just("b"), Mono.just("c"));
    Flux<String> mergedMonos = Flux.fromIterable(listOfMonosWithString)
            .flatMapSequential(Function.identity());

    mergedMonos
            .reduce(String::concat)
            .doOnNext(System.out::println)
            .subscribe();

【讨论】:

  • 不应该是flatMapSequantial()吗? (假设最终字符串中的顺序应该与单声道的顺序匹配)
  • 实际上是的,我想我们关心订单。好点,谢谢;)
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多