code: @NotNull
      public static <F, S, R> Stream<R> zip(
              @NotNull final Iterator<? extends F> iterator1,
              @NotNull final Iterator<? extends S> iterator2,
              @NotNull final BiFunction<? super F, ? super S, ? extends R> combiner) {
          Objects.requireNonNull(iterator1);
          Objects.requireNonNull(iterator2);
          return new Stream<R>(new ObjZip<F, S, R>(iterator1, iterator2, combiner));
      }
docs: Combines two iterators to a stream by applying specified combiner function to each element at same position.
  
  <p>Example:
  <pre>
  combiner: (a, b) -&gt; a + b
  stream 1: [1, 2, 3, 4]
  stream 2: [5, 6, 7, 8]
  result:   [6, 8, 10, 12]
  </pre>
  
  @param <F> the type of first iterator elements
  @param <S> the type of second iterator elements
  @param <R> the type of elements in resulting stream
  @param iterator1  the first iterator
  @param iterator2  the second iterator
  @param combiner  the combiner function used to apply to each element
  @return the new stream
  @throws NullPointerException if {@code iterator1} or {@code iterator2} is null
  @since 1.1.2