@NotNull
    public static <T> Stream<T> iterate(
            @Nullable final T seed,
            @NotNull final UnaryOperator<T> op) {
        Objects.requireNonNull(op);
        return new Stream<T>(new ObjIterate<T>(seed, op));
    }
@ NotNull public static < T > Stream < T > iterate ( @ Nullable final T seed , @ NotNull final UnaryOperator < T > op ) { Objects . requireNonNull ( op ) ; return new Stream < T > ( new ObjIterate < T > ( seed , op ) ) ; }
Creates a {@code Stream} by iterative application {@code UnaryOperator} function
to an initial element {@code seed}. Produces {@code Stream} consisting of
{@code seed}, {@code op(seed)}, {@code op(op(seed))}, etc.

<p>Example:
<pre>
seed: 1
op: (a) -&gt; a + 5
result: [1, 6, 11, 16, ...]
</pre>

@param <T> the type of the stream elements
@param seed  the initial value
@param op  operator to produce new element by previous one
@return the new stream
@throws NullPointerException if {@code op} is null