Одной из наиболее распространенных вещей в коллекции предметов является возможность перебора коллекции.
В Java, например, существуют структуры данных, которые позволяют нам создавать коллекции для примитивных данных или наших пользовательских классов.
Вот некоторые из них: ArrayList
, LinkedList
, HashSet
и другие…
У вышеперечисленного есть что-то общее, все они реализуют интерфейсы: Коллекция и Повторяемый .
Это может дать нам возможность сделать наши собственные классы итеративными:)
В этой статье мы рассмотрим, как это сделать.
Как это работает
Ниже приведена упрощенная UML-диаграмма, иллюстрирующая список массивов:
Вышеперечисленные отношения позволяют нам использовать эту магию:
for(String s: stringList){ // do something with s System.out.print(s); }
Вышесказанное является удобным способом написания цикла foreach на Java, но сам язык переводит его в:
Iteratorsi = stringList.iterator(); while(si.hasNext()){ String s = si.getNext(); // do something with s System.out.print(s); }
Теперь, вооружившись этими знаниями, мы можем выйти за рамки поведения встроенных коллекций по умолчанию и настроить их для наших собственных нужд!
Давайте поиграем с проектом!
Проект: Магазин автозапчастей
получите исходный код здесь
Здесь мы проиллюстрируем настраиваемое поведение, исследуя магазин, который продает автозапчасти, в этой кодовой базе у нас есть класс Warehouse, который содержит список CarPart .
Что мы здесь делаем: Мы будем использовать базовый шаблон итератора для перебора нашего класса склада для деталей автомобиля.
Мы сделаем что-то вроде следующего, чтобы работать:
for(CarPart part: Warehouse){ // do interesting stuff ... }
по умолчанию вышесказанное не работает, так как на нашем складе есть поле ArrayList, но, обладая новыми потрясающими возможностями итератора, мы можем это сделать!
в нашем классе складов у нас есть:
public class Warehouse implements Iterable{ private List carPartList; private String location; ...
В нашем классе склада мы добавляем повторяющиеся инструменты:
public class Warehouse implements Iterable
обратите внимание, что мы использовали тип Деталь автомобиля , так как мы хотим выполнить итерацию по коллекции деталей автомобиля.
также мы внедрим следующее в наш складской класс:
@Override public Iteratoriterator() { return carPartList.iterator(); }
Теперь, когда мы пытаемся просмотреть наш склад, мы просматриваем список запчастей для автомобилей!
// Now this magic is available :) for(CarPart part: Warehouse){ // do interesting stuff ... }
Поздравляю! теперь вы узнали, как взять итерацию в свои руки!
Не стесняйтесь экспериментировать с кодом!!!
Счастливого кодирования!!!
оригинал статьи был опубликован здесь
Оригинал: “https://dev.to/achimoraites/design-patterns-basic-iterator-104c”