我有一个实现Enumeration<T>
接口的类,但Java的foreach循环需要Iterator<T>
接口。 Java的标准库中是否有Enumeration
到Iterator
适配器?
答案 0 :(得分:29)
如果你只想在for-each循环中迭代(所以是Iterable而不仅仅是Iterator),there's always java.util.Collections.list(Enumeration<T> e)
(不使用任何外部库)。
答案 1 :(得分:11)
您需要一个所谓的“适配器”,以使Enumeration
适应不相容的Iterator
。 Apache commons-collections有EnumerationIterator
。用法是:
Iterator iterator = new EnumerationIterator(enumeration);
答案 2 :(得分:7)
a)我很确定你的意思是Enumeration
,而不是Enumerator
b)Guava提供了一个Helper方法Iterators.forEnumeration(enumeration)
,它从枚举中生成一个迭代器,但这也无济于事,因为你需要Iterable
(迭代器的提供者),而不是Iterator
c)你可以使用这个助手类做到这一点:
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;
}
}
现在您的客户端代码如下所示:
for(String string : new WrappingIterable<String>(
Iterators.forEnumeration(myEnumeration))){
// your code here
}
但值得努力吗?
答案 3 :(得分:3)
无需自己动手。看看谷歌的Guava图书馆。具体地
Iterators.forEnumeration()
答案 4 :(得分:2)
没有什么是标准库的一部分。不幸的是,你必须推出自己的适配器。其他人已经做过一些例子,例如:
答案 5 :(得分:1)
或在公共收藏中 EnumerationUtils
import static org.apache.commons.collections.EnumerationUtils.toList
toList(myEnumeration)
答案 6 :(得分:0)
如果您可以修改课程,那么您也可以简单地实施Iterator<T>
并添加remove
方法..