plzdontkillme
plzdontkillme

Reputation: 1527

Iterate through Flux items and add them in to Mono object

I am working on the api, which takes ids. For the given id, I want to download related data from s3 and put them in a new object lets call it data

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>?       
    }

Upvotes: 0

Views: 1531

Answers (1)

Jo&#227;o Dias
Jo&#227;o Dias

Reputation: 17460

You need to collect it into a list and then map it to create a Data object as follows:

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));  
}

Creating a constructor that accepts the S3 objects list is helpful:

class Data {
  private List<S3Object> s3Objects; 

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

Upvotes: 2

Related Questions