집합 객체를 순회하는 패턴. 내부 구현을 드러내지 않고 클라이언트가 내부의 요소 아이템을 순회한다. 자바의 Iterator
도 인터페이스 중 하나다.
Iterator
를 쓰면 객체가 List
라는 것을 알게 되는 단점이 있다.
public class Client {
public static void main(String[] args) {
Board board = new Board();
board.addPost("111");
board.addPost("222");
board.addPost("333");
// TODO 들어간 순서대로 순회하기
List<Post> posts = board.getPosts();
for(int i = 0; i < posts.size(); i++) {
Post post = posts.get(i);
System.out.println(post.getTitle());
}
// TODO 가장 최신 글 먼저 순회하기
Collections.sort(posts, (p1, p2) -> p2.getCreatedDateTime().compareTo(p1.getCreatedDateTime()));
for(int i = 0; i < posts.size(); i++) {
Post post = posts.get(i);
System.out.println(post.getTitle());
}
}
}
public class Board {
List<Post> posts = new ArrayList<>();
public List<Post> getPosts() {
return posts;
}
public void addPost(String content) {
this.posts.add(new Post(content));
}
}
public class Client {
public static void main(String[] args) {
Board board = new Board();
board.addPost("111");
board.addPost("222");
board.addPost("333");
// TODO 들어간 순서대로 순회하기
Iterator<Post> iterator = board.getDefaultIterator();
while(iterator.hasNext()) {
System.out.println(iterator.next().getTitle());
}
// TODO 가장 최신 글 먼저 순회하기
Iterator<Post> recentPostIterator = board.getRecentIterator();
while(recentPostIterator.hasNext()) {
System.out.println(recentPostIterator.next().getTitle());
}
}
}
public class Board {
List<Post> posts = new ArrayList<>();
public List<Post> getPosts() {
return posts;
}
public void addPost(String content) {
this.posts.add(new Post(content));
}
public Iterator<Post> getDefaultIterator() {
return new RecentPostIterator(this);
}
}
public class RecentPostIterator implements Iterator<Post> {
private Iterator<Post> internalIterator;
private Board board; // 선택
public RecentPostIterator(List<Post> posts) {
Collections.sort(posts, (p1, p2) -> p2.getCreatedDateTime().compareTo());
this.internalIterator = posts.iterator();
}
@Override
public boolean hasNext() {
return this.internalIterator.hasNext();
}
@Override
public Post next() {
return this.internalIterator.next();
}
}
java 9
에서는 자동으로 Iterator
로 변환도 해주고, Iterator
의 사용 빈도도 증가했다.
Streaming
과 관련한 iterator