자바 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 | 스트림 요소의 개수 추출 |
정리하자면
스트림은 컬렉션과 다르게 내부 반복을 지원하고 요청할 때만 계산하며 중간 연산을 거쳐 최종 연산을 통해 스트림이 아닌 결과를 반환할 수 있습니다. 스트림을 사용하면 더 간결하고 가독성 좋은 코드를 생성할 수 있습니다.😊
'백엔드 > Java' 카테고리의 다른 글
BigDecimal divide 시 에러 (0) | 2022.12.21 |
---|---|
상속과 컴포지션 (1) | 2022.09.16 |
Long 동일성 == 비교 (0) | 2022.08.18 |
불변 객체와 가변 객체 (0) | 2022.08.14 |
JVM (0) | 2022.08.13 |