Teniendo en cuenta Iterator<Element>
, ¿cómo podemos convertir eso Iterator
a ArrayList<Element>
(o List<Element>
) en el mejor y más rápida manera posible, de manera que podemos utilizar ArrayList
's operaciones en él, tales como get(index)
, add(element)
, etc.
241
En Java 8, puede usar el nuevo
forEachRemaining
método que se ha agregado a laIterator
interfaz:fuente
::
? que nombre tiene parece una referencia directa a list.add (); y parece también algo nuevo de java8; ¡y gracias! :)::
sintaxis es nueva en Java 8, y se refiere a una "referencia de método", que es una forma abreviada de lambda. Consulte aquí para obtener más información: docs.oracle.com/javase/tutorial/java/javaOO/…iterator
viene es un símbolo no resueltoiterator
.Puede copiar un iterador a una nueva lista como esta:
Eso supone que la lista contiene cadenas. Realmente no hay una manera más rápida de recrear una lista desde un iterador, estás atrapado en recorrerla a mano y copiar cada elemento en una nueva lista del tipo apropiado.
EDITAR:
Aquí hay un método genérico para copiar un iterador a una nueva lista de forma segura:
Úselo así:
fuente
Tenga en cuenta que hay una diferencia entre
Iterable
yIterator
.Si tiene un
Iterable
, entonces con Java 8 puede usar esta solución:Como sé
Collectors.toList()
creaArrayList
instancia.En realidad, en mi opinión, también se ve bien en una línea.
Por ejemplo, si necesita regresar
List<Element>
de algún método:fuente
Iterable
iterator
. Son completamente diferentes.Iterator
copia de seguridad a un solo usoIterable
mediante el uso() -> iterator
. Esto puede ser útil en situaciones como esta, pero permítanme enfatizar lo importante nuevamente: puede usar este método solo si un solo usoIterable
es aceptable. Llamariterable.iterator()
más de una vez dará resultados inesperados. La respuesta anterior se convierte entonces enIterator<Element> iterator = createIterator();
List<Element> array = StreamSupport.stream(((Iterable<Element>) () -> iterable).spliterator(), false).collect(toList());
También puede usarlo
IteratorUtils
desde Apache commons-collections , aunque no admite genéricos:fuente
Solución bastante concisa con Java 8 simple usando
java.util.stream
:fuente
iterator.forEachRemaining( list::add )
, también nuevo en Java 8, es mucho más conciso. Insertar la variable de lista enCollector
no mejora la lectura en este caso, ya que debe ser compatible con aStream
y aSpliterator
.fuente
Probar
StickyList
de Cactoos :Descargo de responsabilidad: soy uno de los desarrolladores.
fuente
Iterable
! =Iterator
Aquí hay una línea usando Streams
fuente
Solo quiero señalar una solución aparentemente obvia que NO funcionará:
Esto se debe a
Stream#generate(Supplier<T>)
que solo puede crear secuencias infinitas, no espera que su argumento arrojeNoSuchElementException
(eso es loIterator#next()
que hará al final).La respuesta de xehpuk debe usarse en su lugar si Iterator → Stream → List es su elección.
fuente
usa google guava !
++
fuente
Aquí, en este caso, si quieres la forma más rápida posible, entonces
for loop
es mejor.El iterador sobre un tamaño de muestra de
10,000 runs
tomas40 ms
donde en cuanto a tomas de bucle2 ms
Eso supone que la lista contiene cadenas.
fuente
for
bucle y acceder a los elementos de una listaget(i)
es más rápido que usar un iterador ... pero eso no es lo que pedía el OP, mencionó específicamente que se proporciona un iterador como entrada.get(int)
bucle, solo está viendo 100k de las entradas de 1m. Si cambia ese ciclo para que seait.size()
, verá que estos 2 métodos están cerca de la misma velocidad. En general, este tipo de pruebas de velocidad de Java proporcionan información limitada sobre el rendimiento en la vida real y deben considerarse con escepticismo.