code: public static <T> Stream<T> of(final Supplier<Collection<? extends T>> supplier) {
          final Iterator<T> iter = new ObjIteratorEx<T>() {
              private Iterator<? extends T> iterator = null;
  
              @Override
              public boolean hasNext() {
                  if (iterator == null) {
                      init();
                  }
  
                  return iterator.hasNext();
              }
  
              @Override
              public T next() {
                  if (iterator == null) {
                      init();
                  }
  
                  return iterator.next();
              }
  
              private void init() {
                  final Collection<? extends T> c = supplier.get();
  
                  if (N.isNullOrEmpty(c)) {
                      iterator = ObjIterator.empty();
                  } else {
                      iterator = c.iterator();
                  }
              }
          };
  
          return of(iter);
      }
docs: Lazy evaluation.
  @param supplier
  @return