Search code examples
javaspring-bootreactive-programmingspring-webfluxproject-reactor

How to set a Flux into a list object inside a Mono


I am new to project reactor and I am trying to set a List<Object> inside a Mono<Object> using a Flux<Object>.

So I have a Mono<Person> with an attribute called items which is a List<Item>. Then I received from my service layer a Flux<Item> that I nedd put in items, inside Mono<Person>.

Here is my code:

public class Person {

       List<Item> items;

}
Flux<Item> items = service.getItems();

Person person = new Person();
Mono<Person> monoPerson = Mono.just(person)
                              .map(p -> p.setItems(items))
                              ... //Here I have received an error because a required type is 
                              ... //a List<Items> and I am sendind a Flux<List>

I am frying my mind with this. Some help would be more than appreciate.


Solution

  • You need to think of it as a flow of operations.

    What should happens is:

    1. You receive a flow of items
    2. You collect them as they arrive
    3. Once they've all been collected, you assign them to new Person

    What gives approximately:

    
    public Mono<Person> createPersonFromReceivedItems() {
        Flux<Item> items = service.getItems(); // <1>
        Mono<List<Item>> collectedItems = items.collectList(); // <2>
        Mono<Person> result = collectedItems.map( itemList -> {  // <3>
            Person p = new Person();
            p.setItems(itemList);
            return p;
        });
        
        return result;
    }