【问题标题】:How do we convert a Mono<List<Type>> to a Flux<Type>我们如何将 Mono<List<Type>> 转换为 Flux<Type>
【发布时间】:2017-11-20 19:34:41
【问题描述】:

使用 spring 5,我们有以下需求。

Mono<TheResponseObject> getItemById(String id){
    return webClient.uri('/foo').retrieve().bodyToMono(TheResponseObject)
}

Mono<List<String>> getItemIds(){
    return webClient.uri('/ids').retrieve().bodyToMono(List)
}

Mono<RichResonseObject> getRichResponse(){
    Mono<List> listOfIds = Mono.getItemIds()
    listOfIds.each({ String id ->
        ? << getItemById(id) //<<< how do we convert a list of ids in a Mono to a Flux
    })
    Mono<Object> someOtherMono = getOtherMono()
    return Mono.zip((? as Flux).collectAsList(), someOtherMono).map({
        Tuple2<List, Object> pair ->
        return new RichResonseObject(pair.getT1(), pair.getT2())
    }).cast(RichResonseObject)
}

有哪些方法可以将 Mono> 转换为 Flux

【问题讨论】:

    标签: spring project-reactor reactive


    【解决方案1】:

    这应该可以。 Mono中的给定字符串列表

      Mono<List<String>> listOfIds;
    
      Flux<String> idFlux = listOfIds
        .flatMapMany(ids -> Flux.fromArray(ids.toArray(new String [0])));
    

    更好的是

    listOfIds.flatMapMany(Flux::fromIterable)
    

    【讨论】:

    • 您应该使用Flux.fromIterable() 而不是创建两个新数组。
    • 我们遇到的问题是转换类型——同时将 Mono 转换为 Flux。就像您提到的 flatMapMany 方法一样。感谢您的建议 - 它帮助了我们!
    • 我会尝试更清楚地重新表述这个问题 - 然后很高兴选择这个作为答案。我现在很清楚这里发生了什么:ids.toArray(new String [0])) 虽然
    【解决方案2】:

    请查看以下代码: 第一次将Mono&lt;List&lt;String&gt;&gt; 转换为Flux&lt;List&lt;String&gt;&gt; 并将Flux&lt;List&lt;String&gt;&gt; 转换为Flux&lt;String&gt;

    List<String> asList = Arrays.asList("A", "B", "C", "D");
    Flux<String> flatMap = Mono.just(asList).flux().flatMap(a-> Flux.fromIterable(a));
    

    或者你可以使用flatmapmany

    Flux<String> flatMapMany = Mono.just(asList).flatMapMany(x-> Flux.fromIterable(x));
    

    【讨论】:

      猜你喜欢
      • 2020-07-05
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2017-06-19
      • 2022-08-19
      • 2021-07-27
      • 2015-09-24
      相关资源
      最近更新 更多