[java] 자바 스트림(Java streams)

자바에서 스트림(Stream)은 컬렉션을 다루는 기능을 강화하고 개선하는 새로운 기능이다. 스트림을 사용하면 컬렉션의 요소들을 간결하게 처리할 수 있으며, 병렬 처리도 지원하는 강력한 기능을 제공한다.

스트림의 개념

스트림은 데이터의 흐름을 나타내는 개념이다. 데이터의 흐름을 처리하는 과정에서는 다양한 작업을 수행할 수 있는데, 예를 들어 요소를 필터링하거나 변환하는 등의 작업을 할 수 있다. 스트림을 사용하면 이러한 작업들을 매우 쉽게 수행할 수 있다.

스트림은 다음과 같은 특징을 가지고 있다:

스트림의 사용 방법

스트림을 사용하기 위해서는 먼저 컬렉션을 스트림으로 변환해야 한다. stream() 메서드를 사용하여 컬렉션을 스트림으로 변환할 수 있다. 예를 들어, 다음과 같이 리스트를 스트림으로 변환할 수 있다:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

Stream<Integer> stream = numbers.stream();

스트림으로 변환한 후에는 다양한 연산을 수행할 수 있다. 대표적인 연산으로는 filter()map()이 있다. filter()는 특정 조건을 만족하는 요소들을 걸러내고, map()은 각 요소를 변환해주는 작업을 수행한다.

Stream<Integer> filteredStream = stream.filter(number -> number % 2 == 0);
Stream<Integer> mappedStream = filteredStream.map(number -> number * 2);

위의 예제에서는 스트림을 생성한 후 filter()를 통해 짝수만 남기고, map()을 통해 각 요소를 2배로 변환했다.

스트림의 최종 연산으로는 collect()forEach()가 있다. collect()는 스트림의 결과를 컬렉션으로 변환하거나 요약한 값을 반환한다. forEach()는 각 요소를 순회하면서 특정 작업을 수행한다.

List<Integer> collectedNumbers = mappedStream.collect(Collectors.toList());
collectedNumbers.forEach(System.out::println);

위의 예제에서는 collect()를 이용해 스트림의 결과를 리스트로 변환한 후, forEach()를 통해 각 요소를 출력했다.

병렬 처리

스트림은 병렬 처리를 지원하기 때문에 멀티코어 CPU를 활용하여 작업을 빠르게 처리할 수 있다. 병렬 처리를 위해서는 parallelStream() 메서드를 사용하여 스트림을 생성하면 된다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

Stream<Integer> parallelStream = numbers.parallelStream();

병렬 처리 스트림은 내부적으로 요소를 여러 개의 스레드로 분할하여 처리하므로, 처리 결과의 순서가 항상 보장되지 않는다는 점에 유의해야 한다.

결론

자바 스트림은 컬렉션을 다루는 기능을 강화하고 개선하는 강력한 기능이다. 스트림을 사용하면 데이터를 간결하게 처리할 수 있으며, 병렬 처리를 통해 성능을 향상시킬 수 있다. 스트림을 잘 활용하여 코드를 간결하고 효율적으로 작성해보자!

참고 자료: