reactor-core/src/main/java/reactor/core/publisher/Mono.java
public final <T2, O> Mono<O> zipWhen(Function<T, Mono<? extends T2>> rightGenerator,
			BiFunction<T, T2, O> combinator) {
		Objects.requireNonNull(rightGenerator, "rightGenerator function is mandatory to get the right-hand side Mono");
		Objects.requireNonNull(combinator, "combinator function is mandatory to combine results from both Monos");
		return flatMap(t -> rightGenerator.apply(t).map(t2 -> combinator.apply(t, t2)));
	}
public final <T2, O> Mono<O> zipWhen(Function<T, Mono<? extends T2>> rightGenerator,
			BiFunction<T, T2, O> combinator) {
		Objects.requireNonNull(rightGenerator, "rightGenerator function is mandatory to get the right-hand side Mono");
		Objects.requireNonNull(combinator, "combinator function is mandatory to combine results from both Monos");
		return flatMap(t -> rightGenerator.apply(t).map(t2 -> combinator.apply(t, t2)));
	}
Wait for the result from this mono, use it to create a second mono via the
provided {@code rightGenerator} function and combine both results into an arbitrary
{@code O} object, as defined by the provided {@code combinator} function.

<p>
<img class="marble" src="doc-files/marbles/zipWhenWithZipperForMono.svg" alt="">

@param rightGenerator the {@link Function} to generate a {@code Mono} to combine with
@param combinator a {@link BiFunction} combinator function when both sources complete
@param <T2> the element type of the other Mono instance
@param <O> the element type of the combination

@return a new combined Mono