I have a class that implements the Enum开发者_JAVA技巧eration<T>
interface, but Java's foreach loop requires the Iterator<T>
interface. Is there an Enumeration
to Iterator
Adapter in Java's standard library?
If you just want something to iterate over in a for-each loop (so an Iterable and not only an Iterator), there's always java.util.Collections.list(Enumeration<T> e)
(without using any external libraries).
You need a so called "Adapter", to adapt the Enumeration
to the otherwise incompatible Iterator
. Apache commons-collections has EnumerationIterator
. The usage is:
Iterator iterator = new EnumerationIterator(enumeration);
a) I'm pretty sure you mean Enumeration
, not Enumerator
b) Guava provides a Helper method Iterators.forEnumeration(enumeration)
that generates an iterator from an Enumeration, but that won't help you either, as you need an Iterable
(a provider of Iterators), not an Iterator
c) you could do it with this helper class:
public class WrappingIterable<E> implements Iterable<E>{
private Iterator<E> iterator;
public WrappingIterable(Iterator<E> iterator){
this.iterator = iterator;
}
@Override
public Iterator<E> iterator(){
return iterator;
}
}
And now your client code would look like this:
for(String string : new WrappingIterable<String>(
Iterators.forEnumeration(myEnumeration))){
// your code here
}
But is that worth the effort?
No need to roll your own. Look at Google's Guava library. Specifically
Iterators.forEnumeration()
There's nothing that is part of the standard library. Unfortunately you'll have to roll your own adapter. There are examples out there of what others have done, for example:
IterableEnumerator
or in commons-collections EnumerationUtils
import static org.apache.commons.collections.EnumerationUtils.toList
toList(myEnumeration)
If you can modify the class then you can simply implement Iterator<T>
too and add the remove
method..
精彩评论