Когда использовать 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 ведь тоже интерфейс.
Ответы (1 шт):
основная разница в том через iterator мы можем вынести поведение обхода коллекции из самой коллекции в отдельный класс и их может быть сколько угодно(реализаций обхода), также реализовать какую-то сложную логику и изменять содержимое коллекции.
List<Integer> integerList = new ArrayList<>();
Collections.addAll(integerList, 1, 2, 3, 4, 5);
Iterator<Integer> iterator = integerList.iterator();
// удалить элементы больше 2
while (iterator.hasNext()) {
if (iterator.next() > 2)
iterator.remove();
}
System.out.println(integerList); // вывод [1, 2]
хотя сама ide предлагает заменить это всё на лямбду
// удалить элементы больше 2
integerList.removeIf(integer -> integer > 2);
System.out.println(integerList); // вывод [1, 2]
а вот цикл foreach, там только чтение, нельзя изменять элементы
for (Integer integer : integerList) {
integer++;
}
System.out.println(integerList); // [1, 2, 3, 4, 5] без изменений
можно самому посмотреть разные реализации перебора коллекций в ide, набираешь it

а насчёт выбора Collection или Iterator, в итераторе 2 метода надо будет переопределить, а в колекшн больше 10. и главный вопрос - зачем свою коллекцию писать?