๐ 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! โ