2010-05-10 10 views
6

chcę coś takiego:Czy istnieje prosty sposób na skopiowanie iteratora do listy w Javie?

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

która powinna być równa:

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

Czy istnieje metoda w API, aby osiągnąć to, czy jest to jedyny sposób?

+0

myślę, że obaj chcą „fooList zwrotny” w tej metodzie, albo przekazać w fooList jako parametr, ponieważ w przeciwnym razie ta metoda faktycznie jest w zasadzie opcją bez wyjścia (z wyjątkiem wyczerpania Iteratora) :) – Cowan

Odpowiedz

11

Nie, nie ma czegoś takiego w standardowym interfejsie API.

W języku Java nie jest idiomatyczne (a zatem dość rzadkie) używanie Iterator jako części interfejsu API; są zwykle produkowane i natychmiast konsumowane.

3

Nie wierzę, że iteratory mają gwarancję zatrzymania się po określonej liczbie iteracji, więc prawdopodobnie nie jest to bezpieczny sposób wstawiania danych do listy. Rozważmy implementację fikcyjnego iteratora, która zawsze zwraca stałą 42 z połączeń z next(). W aplikacji szybko zabraknie pamięci.

7

W Guava (nowy ogólnego przeznaczenia Google biblioteki Java, który zastępuje google-kolekcje), może to być po prostu:

return Lists.newArrayList(fooIterator); 

lub jeśli lista będzie tylko do odczytu:

return ImmutableList.copyOf(fooIterator); 
+0

Lub, oczywiście, Iterators.addAll (zgodnie z sugestią Carla), jeśli chcesz dodać do istniejącej kolekcji. – Cowan

Powiązane problemy