2010-05-10 13 views
6

Je veux quelque chose comme ceci:Existe-t-il un moyen facile de copier un itérateur dans une liste en Java?

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { 
    List<Foo> fooList = new ArrayList<Foo>(); 
    fooList.addAll(fooIterator); 
} 

qui devrait être équivalent à:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { 
    List<Foo> fooList = new ArrayList<Foo>(); 
    while(fooIterator.hasNext()) 
     fooList.add(fooIterator.next()); 
} 

est-il une méthode dans l'API pour y parvenir, ou est-ce la seule façon?

+0

Je pense que vous soit voulez « fooList de retour » dans cette méthode, ou passer dans le fooList en tant que paramètre, car sinon cette méthode est en fait fondamentalement une non-op (sauf pour épuiser l'Iterator) :) – Cowan

Répondre

11

Non, il n'y a rien de tel dans l'API Standard.

En Java, il n'est pas idiomatique (et donc plutôt rare) d'utiliser Iterator dans le cadre d'une API; Ils sont généralement produits et immédiatement consommés.

3

Je ne crois pas que les itérateurs soient arrêtés après un nombre fixe d'itérations, donc ce n'est probablement pas un moyen sûr d'insérer des données dans votre liste. Considérons une implémentation d'itérateur fictif qui renvoie toujours la constante 42 des appels vers next(). Votre application va rapidement manquer de mémoire.

7

Dans Guava (nouveau but général de Google bibliothèque Java, qui remplace google-collections), cela pourrait être tout simplement:

return Lists.newArrayList(fooIterator); 

ou si la liste est en lecture seule:

return ImmutableList.copyOf(fooIterator); 
+0

Ou, en effet, Iterators.addAll (comme suggéré par Carl) si vous voulez ajouter à une collection existante. – Cowan

1

En Java 8 vous pouvez le faire comme ceci:

public void CopyIteratorIntoList(Iterator<Foo> fooIterator) { 
    List<Foo> fooList = new ArrayList<Foo>(); 
    fooIterator.forEachRemaining(fooList::add); 
} 

Voir aussi: Easy way to change Iterable into Collection