Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 8에서 인덱스를 활용해 스트림을 반복 처리하는 방법

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)를 활용해 인덱스 범위를 먼저 생성한 후 배열 요소에 접근하는 방법도 대안으로 고려할 수 있습니다.