У меня есть класс, который реализует интерфейс Enumeration<T>
, но для цикла Java foreach требуется интерфейс Iterator<T>
. Существует ли адаптер Enumeration
to Iterator
в стандартной библиотеке Java?
Обработать перечисление <T> как Iterator <T>
Ответ 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
Там нет ничего, что является частью стандартной библиотеки. К сожалению, вам придется перевернуть свой собственный адаптер. Есть примеры того, что сделали другие, например:
Ответ 6
или в коллекциях коллекций EnumerationUtils
import static org.apache.commons.collections.EnumerationUtils.toList
toList(myEnumeration)
Ответ 7
Если вы можете изменить класс, вы можете просто реализовать Iterator<T>
и добавить метод remove
.