백엔드/Java

Stream API

infitry 2022. 9. 9. 22:00
반응형

자바 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 스트림 요소의 개수 추출

정리하자면

스트림은 컬렉션과 다르게 내부 반복을 지원하고 요청할 때만 계산하며 중간 연산을 거쳐 최종 연산을 통해 스트림이 아닌 결과를 반환할 수 있습니다. 스트림을 사용하면 더 간결하고 가독성 좋은 코드를 생성할 수 있습니다.😊

반응형