@iskateli

Когда использовать Collection, а когда Iterator?

В каких случаях следует идти через Collection, а в каких через Iterator? (особенно если надо просто пробежаться всем элементам). Брюс Эккель в книге "Философия Java" (стр.354) пишет что

Решение с Iterator выглядит привлекательно при написании класса, в котором реали­зация интерфейса Collection затруднена или непрактична.

это и в современной версии Java актуально?
Пример кода:
//:holding/InterfaceVsIterator.java
import typeinfo.pets.*;
import java.util.*;

public class InterfaceVsIterator{

public static void display(Iterator<Pet> it){
  while(it.hasNext()){
  Pet p=it.next();
  System.out.print(p.id()+":"+p+"");
  }
 System.out.println();
}

public static void display(Collection<Pet> pets){
for(Pet p:pets)
  System.out.print(p.id()+":"+p+"");
System.out.println();
}
...


И почему он назвал класс InterfaceVsIterator? Iterator ведь тоже интерфейс.
  • Вопрос задан
  • 696 просмотров
Решения вопроса 1
Vamp
@Vamp
В каких случаях следует идти через Collection, а в каких через Iterator? (особенно если надо просто пробежаться всем элементам).

Зависит от объекта, по которому вы хотите просто пробежаться. Если он имплементирует интерфейс Iterable (или унаследованный от него Collection), то for(Pet p:pets) - ваш вариант.

Через Iterator следует идти, если вы хотите пробежаться по элементам и в процессе пробежки удалить какие-то элементы из итерируемой коллекции. Сделать это безопасно можно только через Iterator.

Решение с Iterator выглядит привлекательно при написании класса, в котором реали­зация интерфейса Collection затруднена или непрактична.

Здесь автор имеет ввиду, если вы сами пишете класс, по которому можно "пробежаться". В этом случае проще всего сделать это через итератор, так как в нем меньше методов, которые необходимо реализовать, по сравнению с интерфейсом Collection.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
xez
@xez Куратор тега Java
TL Junior Roo
Старайтесь никогда не использовать циклы for и while.
Вместо них используйте Stream API.
Ответ написан
@mailtime
в случае с итератором:
параметр Итератор и на входе аргумент:
  1. коллекция.->вызовите метод итератора. list.iterator()
  2. массив. ->получите массив как stream и вызовите итератор Arrays.stream(array).iterator()

изменяемая коллекция при обходе итератора можно удалить/обновить элемент.
не изменяемые: Set.of() и тд, Arrays.asList(array). or Arrays.stream(array)
**********************************************************************************************************************************************
в случае с коллекцией:
параметр коллекция:
входящий аргумент коллекция.
из любой входящей коллекции нельзя вставить/удалить элемент(ы).
обновление элемента возможно, если коллекция изменяемая.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы