🕐 Tempo di lettura: 2 minuti

Quando lavoriamo con WebFlux migliorare la leggibilità del codice è fondamentale. Guardiamo un esempio pratico!

Ipotizziamo di avere i seguenti metodi:

List<Student> getStudents() { ... }
Mono<Student> validateStudent(final Student student) { ... }
Mono<Grade> calculateGradeForStudent(final Student student) { ... }

e di dover scrivere diversamente questo frammento di codice:

Mono.just(getStudents())
    .flatMapIterable(UnaryOperator.identity())
    .flatMap(this::validateStudent)
    .flatMap(student -> Mono.zip(
            Mono.just(student),
            calculateGradeForStudent(student)))
    .map(tuple2 -> ...)

Possiamo essere più sintetici utilizzando l'operatore zipWhen:

Flux.fromIterable(getStudents())
    .flatMap(student -> validateStudent(student)
            .zipWhen(this::calculateGradeForStudent))
    .map(tuple2 -> ...)

📌 Conclusione

L'operatore zipWhen permette di "combinare" due operazioni in cui la seconda (calculateGradeForStudent) viene eseguita solo dopo la prima (validateStudent), poiché ne dipende direttamente. Viene così migliorata la leggibilità e nel caso in esame viene anche garantito che l'elaborazione del voto avvenga per ciascuno studente in modo controllato e sequenziale.

Inoltre, zipWhen ci consente di ottenere in output Tuple2<Student, Grade>. Questo è particolarmente utile quando si vuole avere accesso ad entrambi gli oggetti per ulteriori elaborazioni successive.

🔍 Considerazioni aggiuntive

Alla prossima pillola! ☕