🕐 Tempo di lettura: 2 minuti
Quando lavoriamo con WebFlux, spesso ci troviamo a gestire l'output di due Mono combinati tra loro con zip. Il risultato è un oggetto di tipo Tuple2, una struttura che rappresenta una coppia immutabile di valori. Tuttavia, maneggiare molte Tuple2 può rendere il codice meno leggibile e più complesso da mantenere.
📌 La variante con combinator
Per questo motivo, esistono varianti dei metodi zip, zipWith e zipWhen che accettano un combinator (una funzione di aggregazione) come parametro, permettendoci di ottenere direttamente un oggetto ben tipato invece di una generica tupla.
// (1) Using zip methods to create a strongly-typed object instead of Tuple2
private record Car(String licensePlate, Integer numberOfDoors) {}
@Test
void test_combinator() {
checkCar(Mono.zip(Mono.just("BMT 216A"), Mono.just(5), Car::new));
checkCar(Mono.just("BMT 216A").zipWith(Mono.just(5), Car::new));
checkCar(Mono.just("BMT 216A").zipWhen(t1 -> Mono.just(5), Car::new));
}
private void checkCar(final Mono<Car> carMono) {
final Car actualCar = carMono.block();
assertNotNull(actualCar);
assertEquals("BMT 216A", actualCar.licensePlate());
assertEquals(5, actualCar.numberOfDoors());
}
Grazie a questa strategia, possiamo evitare di lavorare con tuple generiche e ottenere oggetti con parametri chiaramente definiti, migliorando la leggibilità e la manutenibilità del codice.
📑 Nota: oltre i due Mono
I metodi con combinator sono disponibili in Mono solo per due elementi. Se dobbiamo gestire Tuple3, Tuple4 o superiori, possiamo definire un metodo custom:
// (2) Custom zip method for combining three Monos into a strongly-typed object, avoiding Tuple3 usage
public static <T1, T2, T3, R> Mono<R> zip(
final Mono<T1> m1, final Mono<T2> m2, final Mono<T3> m3, final Function3<T1, T2, T3, R> mapper) {
return Mono.zip(m1, m2, m3).map(mapTuple(mapper));
}
private static <T1, T2, T3, R> Function<Tuple3<T1, T2, T3>, R> mapTuple(final Function3<T1, T2, T3, R> mapper) {
return tuple -> mapper.apply(tuple.getT1(), tuple.getT2(), tuple.getT3());
}
Ti è piaciuto questo Java tip? Questo spunto è nato da un interessante momento di condivisione in azienda!
Alla prossima pillola! ☕