Обработать перечисление <T> как Iterator <T>

У меня есть класс, который реализует интерфейс Enumeration<T>, но для цикла Java foreach требуется интерфейс Iterator<T>. Существует ли адаптер Enumeration to Iterator в стандартной библиотеке Java?

Ответ 1

Вам нужен так называемый "Адаптер", чтобы адаптировать Enumeration к несовместимому с другими параметрам Iterator. В коллекциях коллекций Apache есть EnumerationIterator. Использование:

Iterator iterator = new EnumerationIterator(enumeration);

Ответ 2

Если вы просто хотите, чтобы что-то повторялось в цикле for-each (так что Iterable и не только Iterator), всегда java.util.Collections.list(Enumeration<T> e) (без использования каких-либо внешних библиотек).

Ответ 3

a) Я уверен, что вы имеете в виду Enumeration, а не Enumerator
b) Guava предоставляет метод Помощника Iterators.forEnumeration(enumeration) который генерирует итератор из 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            
}

Но стоит ли это усилий?

Ответ 4

Не нужно сворачивать самостоятельно. Посмотрите библиотеку Google Guava. Конкретно

Iterators.forEnumeration()

Ответ 5

Там нет ничего, что является частью стандартной библиотеки. К сожалению, вам придется перевернуть свой собственный адаптер. Есть примеры того, что сделали другие, например:

IterableEnumerator

Ответ 6

или в коллекциях коллекций EnumerationUtils

import static org.apache.commons.collections.EnumerationUtils.toList

toList(myEnumeration)

Ответ 7

Если вы можете изменить класс, вы можете просто реализовать Iterator<T> и добавить метод remove.