[java] 스트림을 이용한 병렬 매핑 방법
스트림은 자바 8부터 추가된 기능으로, 컬렉션 요소들을 처리하기 위한 연속적인 연산을 지원합니다. 스트림을 병렬로 처리할 경우, 멀티코어 환경에서 빠른 처리를 할 수 있습니다. 이번 포스트에서는 스트림을 이용하여 병렬 매핑을 하는 방법에 대해 알아보겠습니다.
1. Stream의 parallel() 메서드
스트림을 병렬로 처리하기 위해서는 parallel()
메서드를 호출하면 됩니다. 이 메서드를 호출하면 스트림의 연산이 병렬로 처리되도록 설정됩니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> mappedNumbers = numbers.stream()
.parallel()
.map(n -> n * 2)
.collect(Collectors.toList());
위의 예제에서 parallel()
메서드를 호출하여 스트림을 병렬 처리로 설정하고, map()
메서드를 사용하여 각 요소를 곱하기 2한 결과를 얻습니다.
2. Stream의 parallelStream() 메서드
스트림 객체가 아닌 컬렉션 객체에서 바로 병렬 스트림을 생성하고 싶을 때는 parallelStream()
메서드를 사용할 수 있습니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> mappedNumbers = numbers.parallelStream()
.map(n -> n * 2)
.collect(Collectors.toList());
위의 예제에서는 parallelStream()
메서드를 호출하여 컬렉션에서 바로 병렬 스트림을 생성하고, map()
메서드를 사용하여 각 요소를 곱하기 2한 결과를 얻습니다.
3. 주의사항
스트림을 병렬로 처리할 때는 몇 가지 주의사항이 있습니다.
- 스트림의 연산이 병렬로 처리될 경우, 연산 순서가 보장되지 않습니다. 따라서 순서에 의존하는 연산을 수행할 때 주의해야 합니다.
- 병렬 스트림을 사용할 때는 데이터의 분할과 병합에 대한 오버헤드가 발생하므로, 작업량이 충분히 많은 경우에만 성능 향상을 기대할 수 있습니다.
- 병렬 스트림은 CPU 코어의 수에 따라 작업을 분배하므로, CPU 코어 수에 비례하여 성능이 향상됩니다.