code: public static <L, R, O> Stream<O> zip(Stream<L> lefts, Stream<R> rights, BiFunction<L, R, O> combiner) {
          return StreamSupport.stream(ZippingSpliterator.zipping(lefts.spliterator(), rights.spliterator(), combiner), false)
                  .onClose(closerFor(lefts, rights));
      }
docs: Zip together the "left" and "right" streams until either runs out of values.
  Each pair of values is combined into a single value using the supplied combiner function.
  @param lefts The "left" stream to zip.
  @param rights The "right" stream to zip.
  @param combiner The function to combine "left" and "right" values.
  @param <L> The type over which the "left" stream streams.
  @param <R> The type over which the "right" stream streams.
  @param <O> The type created by the combiner out of pairs of "left" and "right" values, over which the resulting
  stream streams.
  @return A stream of zipped values.