Me pregunto por qué el método Collection.addAll()
solo acepta otras Collection
pero no Iterable
s. ¿Porqué es eso?Java: ¿por qué Collection.addAll no puede aceptar Iterables?
Cualquier método similar para hacer eso para Iterable
s?
Me pregunto por qué el método Collection.addAll()
solo acepta otras Collection
pero no Iterable
s. ¿Porqué es eso?Java: ¿por qué Collection.addAll no puede aceptar Iterables?
Cualquier método similar para hacer eso para Iterable
s?
Probablemente porque la interfaz Collection
se introdujo en Java 1.2 mientras que Iterable
apareció solo en 1.5, y cambiar la interfaz rompería todas las implementaciones existentes.
doh !!! ... tienes razón, en qué estaba pensando. .... borrar ... y más onening – OscarRyz
Esto no explica por qué el método no se agregó posteriormente. – user48956
@ user48956: sí, lo hace: "al cambiar la interfaz se romperían todas las implementaciones existentes". Aunque eso realmente no fue cierto con la introducción de métodos predeterminados en Java 8. –
Básicamente porque un Iterable
puede que nunca termine (es decir, hasNext()
devuelve verdadero para siempre).
Además, para mantener la congruencia, usted puede pensar que un Collection
pueden añadir todos los elementos de otra colección, pero, una Iterable
no es necesarily una colección (que puede ser cualquier cosa, como el envoltorio de un ResultSet
por ejemplo).
Ah, su primer punto es bueno. Realmente no entiendo qué quiere decir con el segundo y cómo afectaría el método 'addAll'. – Albert
En cuanto al segundo, un iterable es una interfaz, casi cualquier cosa, podría implementarlo, y puede terminar en la primera situación, con un posible bucle infinito. – OscarRyz
No estoy seguro Estoy de acuerdo. Una Colección puede ser infinita de la misma manera que una Iterable, ya que puedes construir una Colección válida como un contenedor alrededor de un Iterable. – GaryF
Hay muchas cosas en el núcleo JDK que no funcionan tan bien con Iterables simples como podrían. Recomiendo usar Guava para superar muchas de estas deficiencias.
Hola, ¿puedes enumerar en breve algunas de estas deficiencias? – ctomek
@ctomek: Realmente sería una lista de lo que Guava pone a disposición, que se muestra mejor al seguir el enlace y ver lo que proporciona ... –
En caso de duda, siempre revise la guayaba (o comunes):
+1 por * En caso de duda, siempre revise Guava *. La mayoría de las bibliotecas de Apache commons son geniales, pero los commons/collections son molestos porque no admiten genéricos. –
Tiene un tenedor que admite genéricos: https://github.com/megamattron/collections-generic – thSoft
Otros han contestado el "por qué" ampliamente.
¿Algún método similar para hacer Iterables?
En Java 8 que no es necesario addAll
más:
Collection<X> coll = ...;
Iterable<X> it = ...;
it.forEach(coll::add); // coll.addAll(it);
Esto es exactamente lo que estaba buscando. Sabía que era posible solo con el JDK. ¡Gracias! – Michael
si usted está buscando la manera más fácil de añadir un iterador a una colección sin un bucle explícito, se puede usar 'yourCollection. addAll (org.apache.commons.collections.IteratorUtils.toList (yourIterable.iterator())) ' – mihi
y en caso de que su Iterable sea una matriz, use' java.util.Arrays.asList() ' – mihi
Las matrices no implementan' Iterable' –