code: public static <T, X extends Throwable> Subscription forEach(final Stream<T> stream, final long x,
                                                                  final Consumer<? super T> consumerElement, final Consumer<? super Throwable> consumerError, final Runnable onComplete) {
          val t2 = FutureStreamUtils.forEachXEvents(stream, x, consumerElement, consumerError, onComplete);
          t2._2().run();
          return t2._1().join();
      }
docs: Perform a forEach operation over the Stream  without closing it,  capturing any elements and errors in the supplied consumers, but only consuming
  the specified number of elements from the Stream, at this time. More elements can be consumed later, by called request on the returned Subscription,
  when the entire Stream has been processed an onComplete event will be recieved.
  
  <pre>
  @{code
  Subscription next = Streams.forEach(Stream.of(()->1,()->2,()->{throw new RuntimeException()},()->4)
  .map(Supplier::getValue) ,System.out::println, e->e.printStackTrace(),()->System.out.println("the take!"));
  
  System.out.println("First batch processed!");
  
  next.request(2);
  
  System.out.println("Second batch processed!");
  
  //prints
  1
  2
  First batch processed!
  
  RuntimeException Stack Trace on System.err
  
  4
  Second batch processed!
  The take!
  }
  </pre>
  @param stream - the Stream to consume data from
  @param x To consume from the Stream at this time
  @param consumerElement To accept incoming elements from the Stream
  @param consumerError To accept incoming processing errors from the Stream
  @param onComplete To run after an onComplete event
  @return Subscription so that further processing can be continued or cancelled.