자바의 반복자 가이드

1. 소개

반복자는 우리가 컬렉션을 통과 할 수있는 많은 방법 중 하나이며, 모든 옵션으로, 그것의 장점과 단점을 가지고있다.

Enumeration을 대체하기 위해 Java 1.2에서 처음 도입되었으며 다음과 같습니다.

  • 개선 된 메소드 이름 도입
  • 우리가 반복하는 컬렉션에서 요소를 제거 할 수 있도록했습니다.
  • 반복 순서를 보장하지 않습니다.

이 자습서에서는 간단한 Iterator 인터페이스를 검토하여 다양한 메서드를 사용하는 방법을 알아 봅니다.

흥미로운 기능을 추가 하는 더 강력한 ListIterator 확장 도 확인합니다 .

2. 반복자 인터페이스

시작하려면 컬렉션 에서 Iterator 를 얻어야합니다 . 이것은 iterator () 메서드 를 호출하여 수행됩니다 .

간단히하기 위해 목록에서 Iterator 인스턴스를 가져 옵니다.

List items = ... Iterator iter = items.iterator();

반복자 인터페이스는 세 가지 핵심 방법이 있습니다 :

2.1. hasNext ()

hasNext () 을 반복 왼쪽 적어도 하나 개의 요소가 있는지 확인하는 방법이 사용될 수있다.

while 루프 에서 조건으로 사용하도록 설계되었습니다 .

while (iter.hasNext()) { // ... }

2.2. 다음()

다음 () 메소드는 다음 요소를 통해 스테핑을 얻기 위해 사용될 수있다 :

String next = iter.next();

그것의 좋은 연습이 사용하는 hasNext ()를 호출하기 전에 다음 () .

컬렉션의 반복자 는 특정 구현에서 제공하지 않는 한 특정 순서로 반복을 보장하지 않습니다.

2.3. 없애다()

마지막으로 컬렉션에서 현재 요소를 제거 하려면 remove를 사용할 수 있습니다 .

iter.remove();

이것은 ConcurrentModificationException 의 위험없이 컬렉션을 반복하는 동안 요소를 제거하는 안전한 방법 입니다.

2.4. 전체 반복기 예제

이제 우리는 그것들을 모두 결합하고 컬렉션 필터링을 위해 세 가지 방법을 함께 사용하는 방법을 살펴볼 수 있습니다.

while (iter.hasNext()) { String next = iter.next(); System.out.println(next); if( "TWO".equals(next)) { iter.remove(); } }

이것이 우리가 일반적으로 반복자를 사용하는 방법 이며, 다른 요소가 있는지 미리 확인하고 검색 한 다음 이에 대해 작업을 수행합니다.

2.5. Lambda 식으로 반복

이전 예제에서 보았 듯이 모든 요소를 ​​검토하고 요소로 무언가를 수행하고자 할 때 Iterator 를 사용하는 것은 매우 장황 합니다.

Java 8부터는 람다를 사용하여 나머지 요소를 처리 할 수있는 forEachRemaining 메서드가 있습니다.

iter.forEachRemaining(System.out::println);

3. ListIterator 인터페이스

ListIterator 는 목록을 반복하는 새로운 기능을 추가하는 확장입니다.

ListIterator listIterator = items.listIterator(items.size());

이 경우 목록 의 끝인 시작 위치를 제공 할 수있는 방법에 주목하십시오 .

3.1. hasPrevious ()previous ()

반복자는 그것의 등가물에 제공되도록 후방 순회 사용될 수 hasNext ()음을 () :

while(listIterator.hasPrevious()) { String previous = listIterator.previous(); }

3.2. nextIndex ()previousIndex ()

또한 실제 요소가 아닌 인덱스를 탐색 할 수 있습니다.

String nextWithIndex = items.get(listIterator.nextIndex()); String previousWithIndex = items.get(listIterator.previousIndex());

이것은 현재 수정중인 객체의 인덱스를 알아야하거나 제거 된 요소의 기록을 유지하려는 경우에 매우 유용 할 수 있습니다.

3.3. 더하다()

추가 이름에서 알 수 있듯이, 우리가 요소를 추가 할 수 있습니다, 방법 에 의해 반환되는 항목하기 전에 (다음) 에 의해 반환 한 후 ) (이전 :

listIterator.add("FOUR");

3.4. 세트()

The last method worth mentioning is set(), which lets us replace the element that was returned in the call to next() or previous():

String next = listIterator.next(); if( "ONE".equals(next)) { listIterator.set("SWAPPED"); }

It's important to note that this can only be executed if no prior calls to add() or remove() were made.

3.5. Full ListIterator Example

We can now combine them all to make a complete example:

ListIterator listIterator = items.listIterator(); while(listIterator.hasNext()) { String nextWithIndex = items.get(listIterator.nextIndex()); String next = listIterator.next(); if("REPLACE ME".equals(next)) { listIterator.set("REPLACED"); } } listIterator.add("NEW"); while(listIterator.hasPrevious()) { String previousWithIndex = items.get(listIterator.previousIndex()); String previous = listIterator.previous(); System.out.println(previous); }

In this example, we start by getting the ListIterator from the List, then we can obtain the next element either by index –which doesn't increase the iterator's internal current element – or by calling next.

그런 다음 특정 항목을 세트로 바꾸고 추가 로 새 항목을 삽입 할 수 있습니다.

반복의 끝에 도달하면 뒤로 이동하여 추가 요소를 수정하거나 단순히 아래에서 위로 인쇄 할 수 있습니다.

4. 결론

반복자 인터페이스는 문 동안 /에 대한 간단한 더 어렵있는, 그것을 통과하는 동안 우리가 컬렉션을 수정할 수 있습니다. 이는 결과적으로 우수한 응집력과 낮은 결합을 유지하면서 컬렉션 처리 만 요구하는 많은 방법에서 사용할 수있는 좋은 패턴을 제공합니다.

마지막으로 항상 GitHub에서 전체 소스 코드를 사용할 수 있습니다.