// 컬렉션이나 배열 순회할 때는 이 숙어를 따르자
for (Element e : elements) {
doSomthing(e);
}
enum Suit { CLUB, DIAMOND, HEART, SPADE }
enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,
NINE, TEN, JACK, QUEEN, KING }
...
Collection<Suit> suits = Arrays.asList(Suit.values());
Collection<Rank> ranks = Arrays.asList(Rank.values());
List<Card> deck = new ArrayList<Card>();
for (Iterator<Suit> i = suits.iterator(); i.hasNext(); )
for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); )
deck.add(new Card(i.next, j.next()));
// 주사위를 두 번 굴렸을 때 얻을 수 있는 모든 조합 출력
enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX }
...
Collection<Face> faces = Arrays.asList(Face.values());
for (Iterator<Face> i = faces.iterator(); i.hasNext(); )
for (Iterator<Face> j = faces.iterator(); j.hasNext(); )
System.out.println(i.next() + " " + j.next());
for (Iterator<Suit> i = suits.iterator(); i.hasNext(); ) {
Suit suit = i.next();
for (Iterator<Rank> j = ranks.iterator(); j.hasNext(); )
deck.add(new Card(suit, j.next()));
}
for (Suit suit : suits)
for (Rank rank : ranks)
deck.add(new Card(suit, rank));
public interface Iterable<E> {
// 이 Iterable 안에 있는 원소들에 대한 반복자 반환
Iterator<E> iterator();
}
1. 필터링(filtering)
컬렉션을 순회하다가 특정한 원소를 삭제할 필요가 있다면, 반복자의 remove 메서드를 호출해야 하기 위해 반복자를 명시적으로 사용.
2. 변환(transforming)
리스트나 배열을 순회하다가 그 원소 가운데 일부 또는 전부의 값을 변경해야 한다면, 원소의 값을 수정하기 위해 리스트 반복자나 배열 첨자가 필요.
3. 병렬순회(parallel iteration)
여러 컬렉션을 병렬적으로 순회해야 하고, 모든 반복자나 첨자 변수가 발맞춰 나아가도록 구현해 야 한다면 반복자나 첨자변수를 명시적으로 제어