🕐 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
UnaryOperator.identity()è semplicementeFunction<T, T> identity = t -> t;Mono.just(getStudents()).flatMapIterable(t -> t)può essere sintetizzato conFlux.fromIterable(getStudents())this::calculateGradeForStudentequivale astudent -> calculateGradeForStudent(student)
Alla prossima pillola! ☕