Stream API
자바 8에 추가된 API인 스트림에 대해 알아보겠습니다.
Stream API?
Stream API란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 데이터입니다.
Stream은 마치 Builder 패턴과 비슷하게 내부 반복을 통해 데이터 처리 연산을 적용합니다.
! 기존 Collection을 for 문으로 반복하는 방식은 외부 반복
Stream API 특징
- 선언형 : 더 간결하고 가독성이 좋아진다.
- 조립할 수 있음 : 유연성이 좋아진다.
- 병렬화 : 성능이 좋아진다.
Stream 이용과정
스트림은 질의를 수행할 데이터 소스를 중간 연산을 거쳐 최종 연산을 합니다.
예를 들어 아래와 같은 ArrayList가 존재한다고 가정했을 때
// ArrayList 객체에 추가 된 목록이 있다고 가정
List<Test> testList = new ArrayList<>();
List<String> results = testList.stream().map(Test::getName).limit(3).collect(toList());
Collection의 stream() 메서드로 질의를 수행할 데이터 소스를 불러옵니다.
.map(Test::getName)과 .limit(3)란 중간 연산자를 거쳐
.collect(toList()) 란 최종 연산을 진행합니다.
중간 연산과 최종 연산은 예시에서 사용 된 연산 외에도 많은 종류가 있습니다.😃
컬렉션과 스트림
컬렉션은 모든 값을 메모리에 저장하는 자료구조, 컬렉션의 모든 요소는 컬렉션에 추가하기 전에 계산되어야 함.
스트림은 요청할 때만 요소를 계산하는 고정된 자료구조, 스트림에서 요소를 추가하거나 스트림에서 요소를 제거할 수 없다.
컬렉션은 병렬성 구현을 알아서 해야하지만 스트림은 병렬성 구현을 자동으로 선택한다.
스트림의 중간연산과 최종연산 표
연산 | 형식 | 설명 |
filter | 중간연산 | 조건에 맞게 필터링한다. |
distinct | 중복을 제거한다. | |
skip | N 개의 요소를 건너 뛴다. | |
limit | N 개의 요소만 추출한다. | |
map | 새로운 요소로 매핑한다. | |
flatMap | 평면화된 스트림을 반환한다. | |
sorted | 요소를 정렬한다. | |
anyMatch | 최종연산 | 하나라도 매칭되는게 있는지 |
noneMatch | 하나도 매칭되는게 없는지 | |
allMatch | 전부 매칭되는지 | |
findAny | 임의의 요소 추출 | |
findFirst | 첫 번째 요소 추출 | |
forEach | 스트림 요소 반복 | |
collect | 스트림을 원하는 자료형으로 변환 | |
reduce | 모든 스트림 요소를 처리해서 값으로 도출 | |
count | 스트림 요소의 개수 추출 |
정리하자면
스트림은 컬렉션과 다르게 내부 반복을 지원하고 요청할 때만 계산하며 중간 연산을 거쳐 최종 연산을 통해 스트림이 아닌 결과를 반환할 수 있습니다. 스트림을 사용하면 더 간결하고 가독성 좋은 코드를 생성할 수 있습니다.😊