reactor-core/src/main/java/reactor/core/publisher/Flux.java
public final <TRight, TLeftEnd, TRightEnd, R> Flux<R> groupJoin(
			Publisher<? extends TRight> other,
			Function<? super T, ? extends Publisher<TLeftEnd>> leftEnd,
			Function<? super TRight, ? extends Publisher<TRightEnd>> rightEnd,
			BiFunction<? super T, ? super Flux<TRight>, ? extends R> resultSelector
	) {
		return onAssembly(new FluxGroupJoin<T, TRight, TLeftEnd, TRightEnd, R>(
				this, other, leftEnd, rightEnd, resultSelector,
				Queues.unbounded(Queues.XS_BUFFER_SIZE),
				Queues.unbounded(Queues.XS_BUFFER_SIZE)));
	}
public final <TRight, TLeftEnd, TRightEnd, R> Flux<R> groupJoin(
			Publisher<? extends TRight> other,
			Function<? super T, ? extends Publisher<TLeftEnd>> leftEnd,
			Function<? super TRight, ? extends Publisher<TRightEnd>> rightEnd,
			BiFunction<? super T, ? super Flux<TRight>, ? extends R> resultSelector
	) {
		return onAssembly(new FluxGroupJoin<T, TRight, TLeftEnd, TRightEnd, R>(
				this, other, leftEnd, rightEnd, resultSelector,
				Queues.unbounded(Queues.XS_BUFFER_SIZE),
				Queues.unbounded(Queues.XS_BUFFER_SIZE)));
	}
public final < TRight , TLeftEnd , TRightEnd , R > Flux < R > groupJoin ( Publisher < ? extends TRight > other , Function < ? super T , ? extends Publisher < TLeftEnd > > leftEnd , Function < ? super TRight , ? extends Publisher < TRightEnd > > rightEnd , BiFunction < ? super T , ? super Flux < TRight > , ? extends R > resultSelector ) { return onAssembly ( new FluxGroupJoin < T , TRight , TLeftEnd , TRightEnd , R > ( this , other , leftEnd , rightEnd , resultSelector , Queues . unbounded ( Queues . XS_BUFFER_SIZE ) , Queues . unbounded ( Queues . XS_BUFFER_SIZE ) ) ) ; }
Map values from two Publishers into time windows and emit combination of values
in case their windows overlap. The emitted elements are obtained by passing the
value from this {@link Flux} and a {@link Flux} emitting the value from the other
{@link Publisher} to a {@link BiFunction}.
<p>
There are no guarantees in what order the items get combined when multiple items from
one or both source Publishers overlap.
<p>
Unlike {@link Flux#join}, items from the second {@link Publisher} will be provided
as a {@link Flux} to the {@code resultSelector}.

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

@param other the other {@link Publisher} to correlate items with
@param leftEnd a function that returns a Publisher whose emissions indicate the
time window for the source value to be considered
@param rightEnd a function that returns a Publisher whose emissions indicate the
time window for the {@code right} Publisher value to be considered
@param resultSelector a function that takes an item emitted by this {@link Flux} and
a {@link Flux} representation of the overlapping item from the other {@link Publisher}
and returns the value to be emitted by the resulting {@link Flux}
@param <TRight> the type of the elements from the right {@link Publisher}
@param <TLeftEnd> the type for this {@link Flux} window signals
@param <TRightEnd> the type for the right {@link Publisher} window signals
@param <R> the combined result type

@return a joining {@link Flux}
@see #join(Publisher, Function, Function, BiFunction)
Map values from two Publishers into time windows and emit combination of values in case their windows overlap . The emitted elements are obtained by passing the value from this { @link Flux } and a { @link Flux } emitting the value from the other { @link Publisher } to a { @link BiFunction } . <p > There are no guarantees in what order the items get combined when multiple items from one or both source Publishers overlap . <p > Unlike { @link Flux#join } items from the second { @link Publisher } will be provided as a { @link Flux } to the { @code resultSelector } .