< prev index next >

src/java.base/share/classes/java/util/Scanner.java

Print this page
rev 53930 : 8148917: enhanced-for statement should allow streams
Reviewed-by: XXX

*** 305,315 **** * </dl> * <p>Whitespace is not significant in the above regular expressions. * * @since 1.5 */ ! public final class Scanner implements Iterator<String>, Closeable { // Internal buffer used to hold input private CharBuffer buf; // Size of internal character buffer --- 305,315 ---- * </dl> * <p>Whitespace is not significant in the above regular expressions. * * @since 1.5 */ ! public final class Scanner implements Iterator<String>, Closeable, IterableOnce<String> { // Internal buffer used to hold input private CharBuffer buf; // Size of internal character buffer
*** 370,379 **** --- 370,382 ---- private PatternLRUCache patternCache = new PatternLRUCache(7); // A holder of the last IOException encountered private IOException lastException; + // Whether this Scanner, as IterableOnce, has been consumed + private boolean consumed = false; + // Number of times this scanner's state has been modified. // Generally incremented on most public APIs and checked // within spliterator implementations. int modCount;
*** 1478,1487 **** --- 1481,1508 ---- throwFor(); } } /** + * Returns this Scanner instance. This method exists to implement the + * {@link IterableOnce} interface, allowing a Scanner instance to be + * used in an enhanced-for ("for each") statement. This method can be + * called no more than once on any Scanner instance. The second and + * subsequent calls result in an exception. + * + * @throws IllegalStateException if this method had been called previously + * @return this Scanner instance + */ + public Scanner iterator() { + if (consumed) { + throw new IllegalStateException(); + } + consumed = true; + return this; + } + + /** * The remove operation is not supported by this implementation of * {@code Iterator}. * * @throws UnsupportedOperationException if this method is invoked. * @see java.util.Iterator
< prev index next >