将枚举<T>视为迭代器<T>

fre*_*low 15 java foreach iterator enumeration adapter

我有一个实现Enumeration<T>接口的类,但Java的foreach循环需要Iterator<T>接口.是否有一个EnumerationIteratorJava的标准库适配器?

Dav*_*vid 30

如果你只想在for-each循环中迭代一些东西(所以Iterable而不仅仅是Iterator),总会有 java.util.Collections.list(Enumeration<T> e)(不使用任何外部库).

  • 这是一个简单的答案,使用专门为此目的设计的标准java类/方法。 (2认同)

Boz*_*zho 11

您需要一个所谓的"适配器",以适应Enumeration其他不兼容的Iterator.Apache commons-collections有EnumerationIterator.用法是:

Iterator iterator = new EnumerationIterator(enumeration);
Run Code Online (Sandbox Code Playgroud)


Sea*_*oyd 7

一)我敢肯定你的意思是Enumeration,不是Enumerator
的b)番石榴提供了一个辅助方法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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您的客户端代码如下所示:

for(String string : new WrappingIterable<String>(
                        Iterators.forEnumeration(myEnumeration))){
    // your code here            
}
Run Code Online (Sandbox Code Playgroud)

但值得努力吗?

  • 另请注意,"Iterable"意味着您可以反复请求迭代器.这个包装不符合. (3认同)