Java 8의 스트림(Stream) API는 기본적으로 인덱스 기반 반복을 직접 지원하지 않습니다. 하지만 AtomicInteger 클래스를 활용하면 스트림을 순회하면서 각 요소의 인덱스를 손쉽게 추적할 수 있습니다.
예제 코드
import java.util.stream.IntStream;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
public class Demo{
public static void main(String[] args){
String[] my_array = { "T", "h", "i", "s", "s","a", "m", "p", "l", "e" };
AtomicInteger my_index = new AtomicInteger();
System.out.println("문자열 배열의 요소들 :");
Arrays.stream(my_array).map(str -> my_index.getAndIncrement() + " -> " + str).forEach(System.out::println);
}
}실행 결과
문자열 배열의 요소들 : 0 -> T 1 -> h 2 -> i 3 -> s 4 -> s 5 -> a 6 -> m 7 -> p 8 -> l 9 -> e
코드 설명
Demo라는 이름의 클래스가 선언되어 있으며, 그 안에 main 함수가 정의되어 있습니다. 이 메인 함수 내부에서는 다음과 같은 작업이 수행됩니다.
- 먼저 문자열 타입의 배열
my_array를 선언하고 초기화합니다. AtomicInteger클래스를 이용해 인덱스 역할을 할 인스턴스를 생성합니다. 일반 int 변수 대신 AtomicInteger를 사용하는 이유는 람다 표현식 내부에서 사실상 final인 변수만 참조할 수 있기 때문입니다.getAndIncrement()메서드는 현재 값을 반환한 뒤 1씩 증가시키므로, 스트림의 각 요소를 매핑하는 과정에서 자동으로 인덱스가 부여됩니다.- 마지막으로
forEach(System.out::println)을 통해 인덱스와 함께 매핑된 각 요소가 콘솔에 순서대로 출력됩니다.
참고 사항
이 방식은 병렬 스트림(parallel stream) 환경에서는 요소 처리 순서가 보장되지 않아 인덱스가 실제 순번과 일치하지 않을 수 있습니다. 따라서 위 예제처럼 순차 스트림(sequential stream)에서 사용하는 것이 안전합니다. 또한 IntStream.range(0, my_array.length)를 활용해 인덱스 범위를 먼저 생성한 후 배열 요소에 접근하는 방법도 대안으로 고려할 수 있습니다.