One JDK5 feature I particularly appreciate is the simplicity of the new foreach syntax, and the addition of an Iterable<T>
interface in support. However, much of the JDK was written before even Iterator
was around such as StringTokenizer
. What to do? Write a wrapper, of course:
/** * <code>EnumerationIterator</code> is an {@link Iterator} wrapper for {@link * Enumeration}. {@link #remove()} is unsupported. */ public class EnumerationIterator <T> implements Iterator<T> { private final Enumeration<T> enumeration; /** * Constructs a new <code>EnumerationIterator</code> from the given * <var>enumeration</var>. * * @param enumeration the enumeration */ public EnumerationIterator(final Enumeration<T> enumeration) { this.enumeration = enumeration; } /** * {@inheritDoc} */ public boolean hasNext() { return enumeration.hasMoreElements(); } /** * {@inheritDoc} */ public T next() { return enumeration.nextElement(); } /** * {@inheritDoc} */ public void remove() { throw new UnsupportedOperationException(); } } /** * <code>EnumerationIterable</code> is an {@link Iterable} wrapper for {@link * Enumeration} to support JDK5 <em>foreach</em> syntax. */ public class EnumerationIterable <T> implements Iterable<T> { private final Enumeration enumeration; /** * Constructs a new <code>EnumerationIterable</code> for the given * <var>enumeration</var>. * * @param enumeration the enumeration */ public EnumerationIterable(final Enumeration enumeration) { this.enumeration = enumeration; } /** * {@inheritDoc} */ public Iterator<T> iterator() { return new EnumerationIterator<T>(enumeration); } }
Now I can write this:
for (final String token : new EnumerationIterable<String>(new StringTokenizer("a:b:c", ":"))) System.out.printnln(token);
1 comment:
There is an even easier way I believe.
for (final String token : Collections.list(new StringTokenizer("a:b:c", ":")).iterator()) {
System.out.printnln(token);
}
Post a Comment