code: public final Disposable subscribe(
  			@Nullable Consumer<? super T> consumer,
  			@Nullable Consumer<? super Throwable> errorConsumer,
  			@Nullable Runnable completeConsumer,
  			@Nullable Consumer<? super Subscription> subscriptionConsumer) {
  		return subscribeWith(new LambdaMonoSubscriber<>(consumer, errorConsumer,
  				completeConsumer, subscriptionConsumer));
  	}
docs: Subscribe {@link Consumer} to this {@link Mono} that will respectively consume all the
  elements in the sequence, handle errors, react to completion, and request upon subscription.
  It will let the provided {@link Subscription subscriptionConsumer}
  request the adequate amount of data, or request unbounded demand
  {@code Long.MAX_VALUE} if no such consumer is provided.
  <p>
  For a passive version that observe and forward incoming data see {@link #doOnSuccess(Consumer)} and
  {@link #doOnError(java.util.function.Consumer)}.
  <p>
  Keep in mind that since the sequence can be asynchronous, this will immediately
  return control to the calling thread. This can give the impression the consumer is
  not invoked when executing in a main thread or a unit test for instance.
  
  <p>
  <img class="marble" src="doc-files/marbles/subscribeForMono.svg" alt="">
  
  @param consumer the consumer to invoke on each value
  @param errorConsumer the consumer to invoke on error signal
  @param completeConsumer the consumer to invoke on complete signal
  @param subscriptionConsumer the consumer to invoke on subscribe signal, to be used
  for the initial {@link Subscription#request(long) request}, or null for max request
  
  @return a new {@link Disposable} that can be used to cancel the underlying {@link Subscription}