Stream 이란?
Java 8 부터는 java.util.stream이라는 새로운 추가 패키지를 제공합니다. 이 패키지는 Collection을 처리하는데 사용되며, 원하는 결과를 도출해내기 위해 다양한 메소드를 파이프라인으로 연결해 사용할 수 있는 일련의 개체입니다.
Stream의 특징
- Stream은 데이터를 보유하지 않습니다. (자료 구조 X)
- Stream은 본질적으로 Functional합니다. Stream에서 수행되는 작업은 소스를 수정하지 않습니다.
- Stream은 필요한 경우에만 동작하며 소스의 요소들은 작업이 시작될 때만 소비되며 수행됩니다. (Lazy)
- Stream의 생애 주기(lifecycle)은 사용되는 시점 단 한 번만 사용됩니다. Iterator와 마찬가지로 동일한 요소를 다시 방문하기 위해서는 새로운 Stream을 생성해야 합니다.
Stream 기능
Stream은 크게 두 가지 기능으로 분류할 수 있습니다.
Intermediate Operation
Intermediate Operation은 Stream을 다른 Stream으로 변환하는 작업입니다. 이러한 작업은 최종 결과나 출력을 생성하지 않는 대신 추가로 처리하거나 다른 목적으로 사용할 수 있는 새로운 스트림을 생성합니다.
map
map 메소드는 작성한 메소드를 스트림 요소에 적용한 결과로 반환하는데 사용합니다.
List number = Arrays.asList(2,3,4,5);
List square = number.stream().map(x->x*x).collect(Collectors.toList());
//예상 결과값
// 4, 9, 16, 25
filter
filter 메서드는 인수로 전달된 Predicate에 따라 요소를 선택하는데 사용합니다.
List names = Arrays.asList("Reflection","Collection","Stream");
List result = names.stream().filter(s->s.startsWith("S")).collect(Collectors.toList());
//예상 결과 "Stream"
sorted
sorted 메서드는 Comparator에 따라 Stream 요소들을 정렬하는데 사용됩니다.
List names = Arrays.asList("Reflection","Collection","Stream");
List result = names.stream().sorted().collect(Collectors.toList());
Terminal Operation
Terminal Operation은 최종 결과 또는 출력을 생성하는 작업입니다.
collect
collect는 Stream에서 수행된 중간 작업의 결과를 반환하는데 사용됩니다.
List number = Arrays.asList(2,3,4,5,3);
Set square = number.stream().map(x->x*x).collect(Collectors.toSet());
forEach
forEach 메서드는 Stream의 모든 요소를 반복하는데 사용됩니다.
List number = Arrays.asList(2,3,4,5);
number.stream().map(x->x*x).forEach(y->System.out.println(y));
reduce
reduce는 BinaryOperator를 매개변수로 사용해 Stream의 요소를 하나의 값으로 줄이는 데 사용됩니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, (a, b) -> a + b);
System.out.println(sum); // Output: 15
결론
Java 8부터는 Collection을 작업하는 새로운 기능으로 Stream API를 제공하기 시작했습니다. Lazy함과 병렬 처리, 가독성 등 다양한 이점을 가지고 있는 Stream API는 JDK 8 출시 이후 현재까지 많은 사랑을 받고 있습니다.
Stream API는 크게 Intermediate Operation과 Terminal Operation으로 나뉘어져 있습니다. 두 가지의 주요 차이점은 Intermediate Operation은 Stream 처리를 유발하지 않고 대신 추가 처리에 사용할 수 있는 새 Stream을 생성하는 반면 Terminal Operation은 Stream 처리를 트리거하고 최종 결과 또는 출력을 생성합니다.
지금까지 Stream의 특징과 대표적인 기능들에 대해 알아봤습니다. Stream API의 Intermediate Operation과 Terminal Operation은 해당 글에서 설명한 기능 외에도 더 많은 기능들이 제공하니 공식 문서를 한 번 읽어보시는 것을 권장드립니다.
다음 글에서는 지금 배운 Stream을 어떻게 사용하는지, 사용할 경우 어떤 trade-off가 발생할 수 있을지에 대해 이야기해보겠습니다.
감사합니다.
Reference
Interface Stream
The Java 8 Stream API Tutorial
Stream In Java
'Java > 개념' 카테고리의 다른 글
Java JDK 8 버전 업데이트간 TLS 버전으로 인한 발송 실패 이슈 회고 (0) | 2023.04.28 |
---|---|
Heap Pollution(힙 오염) (0) | 2023.04.08 |
Java의 인터페이스는 왜 다른 인터페이스를 구현할 수 없을까? (0) | 2023.03.20 |
9 java best practices (0) | 2023.03.11 |