code: @SuppressWarnings("resource")
      public static <R> Stream<R> zip(final Collection<? extends IntStream> c, final IntNFunction<R> zipFunction) {
          if (N.isNullOrEmpty(c)) {
              return Stream.empty();
          }
  
          final int len = c.size();
          final IntIterator[] iters = new IntIterator[len];
          int i = 0;
  
          for (IntStream s : c) {
              iters[i++] = s.iteratorEx();
          }
  
          return new IteratorStream<>(new ObjIteratorEx<R>() {
              @Override
              public boolean hasNext() {
                  for (int i = 0; i < len; i++) {
                      if (iters[i].hasNext() == false) {
                          return false;
                      }
                  }
  
                  return true;
              }
  
              @Override
              public R next() {
                  final int[] args = new int[len];
  
                  for (int i = 0; i < len; i++) {
                      args[i] = iters[i].nextInt();
                  }
  
                  return zipFunction.apply(args);
              }
          }).onClose(newCloseHandler(c));
      }
docs: Zip together the iterators until one of them runs out of values.
  Each array of values is combined into a single value using the supplied zipFunction function.
  
  @param c
  @param zipFunction
  @return