【问题标题】:Iterate through Flux items and add them in to Mono object遍历 Flux 项目并将它们添加到 Mono 对象
【发布时间】:2023-04-05 00:37:01
【问题描述】:

我正在开发需要 id 的 api。对于给定的 id,我想从 s3 下载相关数据并将它们放入一个新对象中,我们称之为数据

class Data {
  private List<S3Object> s3Objects; 
  //getter-setter 
} 


   public Mono<ResponseEntity<Data>> getData(@RequestParam List<String> tagIds){
        Data data = new Data();
        Flux<S3Object> s3ObjectFlux = Flux.fromStream(tagIds.stream())
                .parallel()
                .runOn(Schedulers.boundedElastic())
                .flatMap(id -> fetchResources(id))
                .flatMap(idS3Object -> Mono.just(s3Object))
                .ordered((u1, u2) -> u2.hashCode() - u1.hashCode());

        //how do i add it in data object to convert Mono<Data>?       
    }

【问题讨论】:

    标签: spring spring-webflux reactive


    【解决方案1】:

    您需要将其收集到一个列表中,然后将其映射以创建Data 对象,如下所示:

    public Mono<ResponseEntity<Data>> getData(@RequestParam List<String> tagIds){
       
       Flux<S3Object> s3ObjectFlux = Flux.fromStream(tagIds.stream())
               .parallel()
               .runOn(Schedulers.boundedElastic())
               .flatMap(id -> fetchResources(id))
               .flatMap(idS3Object -> Mono.just(s3Object))
               .ordered((u1, u2) -> u2.hashCode() - u1.hashCode());
    
       Mono<Data> data = s3ObjectFlux.collectList()
               .map(s3Objects -> new Data(s3Objects));  
    }
    

    创建一个接受 S3 对象列表的构造函数很有帮助:

    class Data {
      private List<S3Object> s3Objects; 
    
      public Data(List<S3Object> s3Objects) {
          this.s3Objects = s3Objects;
      }
      
      //getter-setter 
    } 
    

    【讨论】:

    • 感谢工作
    • 太棒了。考虑接受它作为答案,以便其他人可以从中受益并轻松理解类似问题的可能解决方案;)谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2021-10-04
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多