Учитывая Iterator<Element>
, как мы можем преобразовать это Iterator
в ArrayList<Element>
(или List<Element>
) наилучшим и самым быстрым способом, чтобы мы могли использовать ArrayList
такие операции над ним, как get(index)
, add(element)
и т. Д.
241
В Java 8 вы можете использовать новый
forEachRemaining
метод, который был добавлен вIterator
интерфейс:источник
::
? какое имя у него есть? кажется прямой ссылкой на list.add (); и кажется также некоторая новая вещь java8; и спасибо! :)::
Синтаксис является новым в Java 8, и он ссылается на «ссылку на метод», которая является сокращенной формой лямбды. Смотрите здесь для получения дополнительной информации: docs.oracle.com/javase/tutorial/java/javaOO/…iterator
идет? это неразрешенный символiterator
.Вы можете скопировать итератор в новый список, например так:
Это при условии, что список содержит строки. На самом деле не существует более быстрого способа воссоздания списка из итератора, вы застряли на том, чтобы обходить его вручную и копировать каждый элемент в новый список соответствующего типа.
РЕДАКТИРОВАТЬ :
Вот общий метод для копирования итератора в новый список безопасным для типов способом:
Используйте это так:
источник
Обратите внимание, что есть разница между
Iterable
иIterator
.Если у вас есть
Iterable
, то с Java 8 вы можете использовать это решение:Как я знаю,
Collectors.toList()
создаетArrayList
экземпляр.На самом деле, на мой взгляд, это также хорошо выглядит в одной строке.
Например, если вам нужно вернуться
List<Element>
из какого-либо метода:источник
Iterable
iterator
. Они совершенно разные.Iterator
обратно в одно использованиеIterable
с помощью() -> iterator
. Это может быть полезно в подобных ситуациях, но позвольте мне еще раз подчеркнуть важную вещь: вы можете использовать этот метод, только если допустимо одноразовое использованиеIterable
. Звонокiterable.iterator()
более одного раза даст неожиданные результаты. Выше ответ становитсяIterator<Element> iterator = createIterator();
List<Element> array = StreamSupport.stream(((Iterable<Element>) () -> iterable).spliterator(), false).collect(toList());
Вы также можете использовать
IteratorUtils
из Apache commons-collection , хотя он не поддерживает дженерики:источник
Довольно краткое решение с простой Java 8, используя
java.util.stream
:источник
iterator.forEachRemaining( list::add )
, также новый в Java 8, гораздо более кратким.Collector
Вставка переменной списка в не улучшает читаемость в этом случае, так как она должна поддерживаться aStream
и aSpliterator
.источник
Попробуйте
StickyList
от Cactoos :Отказ от ответственности: я один из разработчиков.
источник
Iterable
! =Iterator
Вот одна строка, использующая потоки
источник
Я просто хочу указать на кажущееся очевидным решение, которое НЕ будет работать:
Это потому, что
Stream#generate(Supplier<T>)
может создавать только бесконечные потоки, он не ожидает, что его аргумент будет выданNoSuchElementException
(это то, чтоIterator#next()
будет делать в конце).Вместо этого следует использовать ответ xehpuk, если вы выбрали путь Iterator → Stream → List.
источник
использовать гугл гуава !
++
источник
Вот в этом случае, если вы хотите самый быстрый путь, то
for loop
лучше.Итератор над образцом размером
10,000 runs
принимает ,40 ms
где за цикл занимает2 ms
Это при условии, что список содержит строки.
источник
for
цикла и доступ к элементам спискаget(i)
быстрее, чем использование итератора ... но это не то, о чем спрашивал ОП, он специально упомянул, что в качестве входных данных указан итератор .get(int)
цикле вы просматриваете только 100 тыс. Записей из 1 млн. Если вы измените этот цикл,it.size()
вы увидите, что эти 2 метода близки к одинаковой скорости. В целом, такие тесты скорости Java предоставляют ограниченную информацию о производительности в реальной жизни и должны рассматриваться скептически.