Обрабатывать перечисление <T>как итератор <T> - PullRequest
15 голосов
/ 15 февраля 2011

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

Ответы [ 7 ]

29 голосов
/ 26 сентября 2013

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

11 голосов
/ 15 февраля 2011

Вам нужен так называемый «адаптер», чтобы адаптировать Enumeration к несовместимому в противном случае Iterator. Apache commons-collection имеет EnumerationIterator. Использование:

Iterator iterator = new EnumerationIterator(enumeration);
7 голосов
/ 15 февраля 2011

а) Я уверен, что вы имеете в виду Enumeration, а не Enumerator
б) Гуава предоставляет метод Helper Iterators.forEnumeration(enumeration), который генерирует итератор из перечисления, но это вам тоже не поможет, так как вам нужен Iterable (поставщик Итераторы), а не Iterator
в) вы могли бы сделать это с помощью этого вспомогательного класса:

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 голосов
/ 15 февраля 2011

Нет необходимости кататься самостоятельно. Посмотрите на библиотеку Google Guava. В частности

Iterators.forEnumeration()
2 голосов
/ 15 февраля 2011

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

IterableEnumerator

1 голос
/ 28 февраля 2013

или в общих коллекциях EnumerationUtils

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

toList(myEnumeration)
0 голосов
/ 15 февраля 2011

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

...