package java.util;

/**
 * An iterator over a collection. {@code Iterator} takes the place of {@link Enumeration} in the
 * Java Collections Framework. Iterators differ from enumerations in two ways:
 *
 * <ul>
 * <li>Iterators allow the caller to remove elements from the underlying collection during the
 * iteration with well-defined semantics.
 * <li>Method names have been improved.
 * </ul>
 *
 * <p>
 * This interface is a member of the Java Collections Framework
 *
 * @param <E>
 *        the type of elements returned by this iterator
 */
public interface Iterator<E> {

    /**
     * Returns {@code true} if the iteration has more elements. (In other words, returns {@code true} if
     * {@link #next} would return an element rather than throwing an exception.)
     *
     * @return {@code true} if the iteration has more elements
     */
    boolean hasNext();

    /**
     * Returns the next element in the iteration.
     *
     * @return the next element in the iteration
     * @throws NoSuchElementException
     *         if the iteration has no more elements
     */
    E next();

    /**
     * Removes from the underlying collection the last element returned by this iterator (optional
     * operation). This method can be called only once per call to {@link #next}. The behavior of an
     * iterator is unspecified if the underlying collection is modified while the iteration is in
     * progress in any way other than by calling this method.
     *
     * @throws UnsupportedOperationException
     *         if the {@code remove} operation is not supported by this iterator
     *
     * @throws IllegalStateException
     *         if the {@code next} method has not yet been called, or the {@code remove} method has
     *         already been called after the last call to the {@code next} method
     */
    void remove();
}
