code: @NotNull
      public static <F, S, R> Stream<R> zip(
              @NotNull Stream<? extends F> stream1,
              @NotNull Stream<? extends S> stream2,
              @NotNull final BiFunction<? super F, ? super S, ? extends R> combiner) {
          Objects.requireNonNull(stream1);
          Objects.requireNonNull(stream2);
          return Stream.<F, S, R>zip(stream1.iterator, stream2.iterator, combiner);
      }
docs: Combines two streams 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 stream elements
  @param <S> the type of second stream elements
  @param <R> the type of elements in resulting stream
  @param stream1  the first stream
  @param stream2  the second stream
  @param combiner  the combiner function used to apply to each element
  @return the new stream
  @throws NullPointerException if {@code stream1} or {@code stream2} is null