이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서 집합체 안에 들어있는 모든 항목에 접근할 수 있도록 하는 패턴이다. java의 stream이 대표적인 이터레이터 패턴의 예시이다.
예시 코드
@RequiredArgsConstructorpublic class ArrIterator implements Iterator<Integer> {
private final Integer[] list; private int position = 0;
@Override public boolean hasNext() { return position < list.length; }
@Override public Integer next() { return list[position++]; }}
@RequiredArgsConstructorpublic class ListIterator implements Iterator<Integer> {
private final List<Integer> list; private int position = 0;
@Override public boolean hasNext() { return position < list.size(); }
@Override public Integer next() { return list.get(position++); }}
java.util의 Iterator를 상속받았고 각각 일반 배열, List를 가지고 있는 두개의 클래스를 만들었다.
public class App {
public static void main(String[] args) {
Integer[] arr = {1, 2, 3}; ArrIterator iterator1 = new ArrIterator(arr);
System.out.println("ArrIterator"); while(iterator1.hasNext()){ System.out.println(iterator1.next()); }
List<Integer> list = Arrays.asList(1, 2, 3); ListIterator iterator2 = new ListIterator(list);
System.out.println("ListIterator"); while(iterator2.hasNext()){ System.out.println(iterator2.next()); } }}
ArrIterator와 ListIterator는 다른 타입의 Integer 목록을 가지고 있지만 인터페이스를 상속받아 구현한 hasNext()와 next()를 통해 동일한 방식으로 요소를 탐색할 수 있다.
이 링크로 가면 코드를 볼 수 있다.