Manera fácil de convertir Iterable en Colección
En mi aplicación utilizo una biblioteca de terceros ( Spring Data for MongoDB
para ser exactos).
Los métodos de esta biblioteca regresan Iterable<T>
, mientras que el resto de mi código espera Collection<T>
.
¿Existe algún método de utilidad en algún lugar que me permita convertir rápidamente uno en otro? Me gustaría evitar crear un montón de foreach
bucles en mi código para algo tan simple.
En JDK 8+, sin utilizar bibliotecas adicionales:
Iterator<T> source = ...;
List<T> target = new ArrayList<>();
source.forEachRemaining(target::add);
Editar: el de arriba es para Iterator
. Si estás tratando con Iterable
,
iterable.forEach(target::add);
Con Guava puedes usar Lists.newArrayList(Iterable) o Sets.newHashSet(Iterable) , entre otros métodos similares. Por supuesto, esto copiará todos los elementos en la memoria. Si eso no es aceptable, creo que el código que funciona con estos debería utilizar Iterable
en lugar de Collection
. Guava también proporciona métodos convenientes para hacer cosas que puedes hacer Collection
usando un Iterable
(como Iterables.isEmpty(Iterable)
o Iterables.contains(Iterable, Object)
), pero las implicaciones de rendimiento son más obvias.