reactor-core/src/main/java/reactor/core/publisher/Flux.java
public final Flux<T> filterWhen(Function<? super T, ? extends Publisher<Boolean>> asyncPredicate,
			int bufferSize) {
		return onAssembly(new FluxFilterWhen<>(this, asyncPredicate, bufferSize));
	}
public final Flux<T> filterWhen(Function<? super T, ? extends Publisher<Boolean>> asyncPredicate,
			int bufferSize) {
		return onAssembly(new FluxFilterWhen<>(this, asyncPredicate, bufferSize));
	}
Test each value emitted by this {@link Flux} asynchronously using a generated
{@code Publisher<Boolean>} test. A value is replayed if the first item emitted
by its corresponding test is {@literal true}. It is dropped if its test is either
empty or its first emitted value is {@literal false}.
<p>
Note that only the first value of the test publisher is considered, and unless it
is a {@link Mono}, test will be cancelled after receiving that first value. Test
publishers are generated and subscribed to in sequence.

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

@reactor.discard This operator discards elements that do not match the filter. It
also discards elements internally queued for backpressure upon cancellation or error triggered by a data signal.

@param asyncPredicate the function generating a {@link Publisher} of {@link Boolean}
for each value, to filter the Flux with
@param bufferSize the maximum expected number of values to hold pending a result of
their respective asynchronous predicates, rounded to the next power of two. This is
capped depending on the size of the heap and the JVM limits, so be careful with
large values (although eg. {@literal 65536} should still be fine). Also serves as
the initial request size for the source.
@return a filtered {@link Flux}