2010-09-30 21 views
36

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?

+0

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

+1

y en caso de que su Iterable sea una matriz, use' java.util.Arrays.asList() ' – mihi

+0

Las matrices no implementan' Iterable' –

Respuesta

35

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.

+0

doh !!! ... tienes razón, en qué estaba pensando. .... borrar ... y más onening – OscarRyz

+2

Esto no explica por qué el método no se agregó posteriormente. – user48956

+0

@ 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. –

10

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).

+0

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

+0

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

+6

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

4

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.

+0

Hola, ¿puedes enumerar en breve algunas de estas deficiencias? – ctomek

+0

@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 ... –

30

En caso de duda, siempre revise la guayaba (o comunes):

+5

+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. –

+0

Tiene un tenedor que admite genéricos: https://github.com/megamattron/collections-generic – thSoft

6

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); 
+0

Esto es exactamente lo que estaba buscando. Sabía que era posible solo con el JDK. ¡Gracias! – Michael

Cuestiones relacionadas