code: public static <E> Stream<Stream<E>> group(Stream<E> stream, Predicate<? super E> splitter, boolean included) {
          Objects.requireNonNull(stream);
          Objects.requireNonNull(splitter);
  
          GroupingOnSplittingSpliterator<E> spliterator = GroupingOnSplittingSpliterator.of(stream.spliterator(), splitter, included);
          return StreamSupport.stream(spliterator, stream.isParallel()).onClose(stream::close);
      }
docs: <p>Generates a stream by regrouping the elements of the provided stream and putting them in a substream.
  This grouping operation scans the elements of the stream using the splitter predicate. When this predicate
  returns true, then the elements of the stream are accumulated in a subtream, until the splitter predicate
  is true again. In this case, a new substream is created, until the elements of the provided stream are
  exhausted. </p>
  <p>In the case where several consecutive splitting elements are met, no empty stream is generated.
  The splitting element is added only once to the next substream if needed. </p>
  <p>The boolean <code>included</code> controls whether the splitting element is added to the substreams or not.</p>
  <p>A {@code {@link NullPointerException}} is thrown if the stream to be grouped or the splitter is null. </p>
  
  @param stream   The stream to be grouped. Will throw a <code>NullPointerException</code> if <code>null</code>.
  @param splitter The predicate used to check for an splitting element.
  @param included if true: includes the splitting element at the beginning of each substream
  @param <E>      The type of the elements of the provided stream.
  @return A grouped stream of streams.