code: @NotNull
      public Stream<List<T>> slidingWindow(final int windowSize, final int stepWidth) {
          if (windowSize <= 0) throw new IllegalArgumentException("windowSize cannot be zero or negative");
          if (stepWidth <= 0) throw new IllegalArgumentException("stepWidth cannot be zero or negative");
          return new Stream<List<T>>(params, new ObjSlidingWindow<T>(iterator, windowSize, stepWidth));
      }
docs: Partitions {@code Stream} into {@code List}s of fixed size by sliding over the elements of the stream.
  It starts with the first element and in each iteration moves by the given step width. This method
  allows, for example, to partition the elements into batches of {@code windowSize} elements (by using a
  step width equal to the specified window size) or to sample every n-th element (by using a window size
  of 1 and a step width of n).
  
  <p>This is an intermediate operation.
  
  <p>Example:
  <pre>
  windowSize: 3, stepWidth: 3
  stream: [1, 1, 1, 2, 2, 2, 3, 3, 3]
  result: [[1, 1, 1], [2, 2, 2] [3, 3, 3]]
  
  windowSize: 2, stepWidth: 3
  stream: [1, 2, 3, 1, 2, 3, 1, 2, 3]
  result: [[1, 2], [1, 2], [1, 2]]
  
  windowSize: 3, stepWidth: 1
  stream: [1, 2, 3, 4, 5, 6]
  result: [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
  </pre>
  
  @param windowSize  number of elements that will be emitted together in a list
  @param stepWidth  step width
  @return the new stream
  @throws IllegalArgumentException if {@code windowSize} is zero or negative
  @throws IllegalArgumentException if {@code stepWidth} is zero or negative