Front/JS & jQuery

[JAVA] Stream은 순서를 지키지 않나요 ?

오선지♬ 2025. 1. 22. 20:10
728x90
반응형

Java의 Stream API는 순서에 따라 동작할 수도 있고, 그렇지 않을 수도 있습니다.

이는 스트림의 유형과 사용한 연산에 따라 달라집니다.

 

1. Stream의 순서

  • 순차 스트림 (Stream)
    • 기본적으로 Stream은 소스 데이터의 순서를 유지합니다.
    • 예를 들어, List에서 스트림을 생성한 경우, 리스트의 요소 순서가 스트림 연산에서도 유지됩니다.
List<String> list = Arrays.asList("A", "B", "C", "D");
list.stream()
    .forEach(System.out::println); // 출력 순서: A, B, C, D
  • 병렬 스트림 (parallelStream)
    • 병렬 스트림은 데이터의 순서를 보장하지 않을 수 있습니다.
    • 여러 스레드를 사용해 데이터를 처리하기 때문에 실행 순서가 달라질 가능성이 있습니다.
list.parallelStream()
    .forEach(System.out::println); // 출력 순서가 다를 수 있음: D, A, B, C

 

 

2. 순서를 지키는 연산

  • filter, map, collect 등의 중간 및 종료 연산은 기본적으로 순서를 유지합니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
                              .filter(n -> n % 2 == 0) // 짝수만 필터링
                              .map(n -> n * 2)         // 두 배로 변환
                              .collect(Collectors.toList());

System.out.println(result); // 출력: [4, 8]

 

 

3. 순서를 깨뜨릴 수 있는 연산

일부 연산은 순서를 유지하지 않거나 순서를 고려하지 않는 옵션을 제공합니다.

  • unordered():
    • 스트림에서 순서를 신경 쓰지 않도록 명시적으로 지정할 수 있습니다. 이 경우, 순서를 최적화하는 방식으로 동작할 수 있습니다.
list.stream()
    .unordered() // 순서 무시
    .forEach(System.out::println);
  • 병렬 스트림 (parallelStream):
    • 병렬 스트림은 순서를 보장하지 않습니다. 순서가 중요하면 병렬 스트림에서 forEachOrdered를 사용해야 합니다.
list.parallelStream()
    .forEachOrdered(System.out::println); // 순서 보장: A, B, C, D
728x90
반응형