code: public static <E, T> Stream<T> shiftingWindowCollect(Stream<E> stream, int rollingFactor, Collector<? super E, ?, ? extends T> collector) {
          Objects.requireNonNull(stream);
          Objects.requireNonNull(collector);
  
          return roll(stream, rollingFactor).map(str -> str.collect(collector));
      }
docs: <p>Generates a stream that is computed from a provided stream following two steps.</p>
  <p>The first steps consists in building a rolling stream with the <code>rollingFactor</code> passed as
  a parameter. This rolling stream is the same the one built using the <code>roll()</code> method.
  </p>
  <p>Then each substream is collected using the collector passed as the third parameter.</p>
  <p>The result is set up in a stream that has the same number of elements as the provided stream,
  minus the size of the window width, to preserve consistency of each collection. </p>
  <p>A <code>NullPointerException</code> will be thrown if the provided stream or the collector is null.</p>
  
  @param stream        the processed stream
  @param rollingFactor the size of the window to apply the collector on
  @param collector     the collector to be applied
  @param <E>           the type of the provided stream
  @param <T>the        type of the returned stream
  @return a stream in which each value is the collection of the provided stream