code: public static <R> Stream<R> zip(final LongIterator a, final LongIterator b, final long valueForNoneA, final long valueForNoneB,
              final LongBiFunction<R> zipFunction) {
          return new IteratorStream<>(new ObjIteratorEx<R>() {
              @Override
              public boolean hasNext() {
                  return a.hasNext() || b.hasNext();
              }
  
              @Override
              public R next() {
                  if (hasNext() == false) {
                      throw new NoSuchElementException();
                  }
  
                  return zipFunction.apply(a.hasNext() ? a.nextLong() : valueForNoneA, b.hasNext() ? b.nextLong() : valueForNoneB);
              }
          });
      }
docs: Zip together the "a" and "b" iterators until all of them runs out of values.
  Each pair of values is combined into a single value using the supplied zipFunction function.
  
  @param a
  @param b
  @param valueForNoneA value to fill if "a" runs out of values first.
  @param valueForNoneB value to fill if "b" runs out of values first.
  @param zipFunction
  @return