728x90
[Reference]
https://tecoble.techcourse.co.kr/post/2021-05-23-stream-api-basic/
https://tecoble.techcourse.co.kr/post/2020-05-14-foreach-vs-forloop/
https://tecoble.techcourse.co.kr/post/2020-09-30-collection-stream-for-each/
Intro
컬렉션의 경우 반복문과 조건문으로 데이터를 처리하게 되고, 이는 클라이언트 코드를 작성하는 개발자마다 구현 방식이 달라질 수 있다.
스트림의 동작 방식은 라이브러리 API 내부 반복을 지원하여 연산을 추상화한다.
데이터 처리 방식 살펴보기
컬렉션으로 데이터를 처리하는 방식에서는 데이터를 어떻게 저장하고 처리할지에 중점을 둔다.
반면 스트림은 데이터에 어떤 연산을 할 것인지 묘사하는 것에 중점을 둔다.
외부적으로 처리되는 Collection의 동작 방식
- 위는 컬렉션을 활용하여 데이터를 처리하는 방식을 도식화한 내용이다.
- 관리하기 위한 데이터를 컬렉션(자료구조)에 적재해놓은 뒤, 개발자가 구현한 로직을 통해 각각의 요소에 접근 및 처리하여 결과값을 클라이언트 코드에 응답하게 된다.
- 이와 같이 구성하기 위해서는 데이터가 어떤 컬렉션에 저장하는 것이 적합할 것인지 선택 및 저장해야 하고, 각 요소별 조회/처리 시에 필요한 방어 코드 또한 필요하다.
내부적으로 처리되는 Stream의 동작 방식
- 위는 스트림 API를 활용하여 데이터를 처리하는 방식에 대해 도식화 한 내용이다.
- Stream은 내부적으로 데이터를 처리하므로 중간 연산을 통해 처리된 결과 값을 클라이언트에서 확인할 수 있다.
최종적으로 처리되는 데이터
- 결국에는 위 2가지 방식 모두 위의 그림처럼 동작한다.
- 의도는 필터링 이후에 특정 필드 값으로 그룹핑하여 결과 리스트를 반환하게 된다.
스트림 이용하는 방법
- 이전 강의에서 특정 상황을 가정하여 반복문과 스트림으로 구현된 코드를 작성하여 차이를 비교해봤고, 2가지 작성 방식은 달랐지만 최종 결과 값이 동일한 것은 확인하였다.
- 이러한 스트림을 잘 사용하기 위해서는 Stream 문법의 구조를 먼저 살펴봐야 한다.
- 크게는 3단계 구조로 볼 수 있다.
- 질의를 수행할 데이터 소스
- 스트림의 파이프라인을 구성할 중간 연산 연결
- 스트림 파이프라인을 실행하고 결과를 만들 최종 연산
- 스트림 API는 데이터 소스를 시작으로, 순차적으로 중간 연산, 최종 연산을 연결하여 파이프라인이라 하는데 이는 빌더 패턴과 비슷하다.
- 스트림에서 제공하는 연산을 살펴보기 위해서는 데이터 처리 질의(query)를 표현하는데 사용할 수 있는 필터링, 슬라이싱, 검색, 매칭, 리듀싱 등 다양한 패턴이 존재한다.
public class ChickenReport {
private final List<Chicken> chickens;
public ChickenReportV2(List<Chicken> chickens) {
this.chickens = chickens;
}
public Map<ChickenBrand, List<Chicken>> singleSizeReport() {
return this.chickens.stream() // 데이터 소스
.filter(ChickenReportV2::isSinglePrice) // 중간연산(필터링)
.collect(groupingBy(Chicken::getBrand)); // 결과를 반환하는 최종연산
}
private static boolean isSinglePrice(Chicken chicken) {
return chicken.getPrice() <= 12_000;
}
}
지금까지 자바 8이상에서 사용할 수 있는 stream에 대해서 살펴보았다.
- 컬렉션보다 스트림을 사용함으로써 얻을 수 있는 장점
- 스트림의 동작방식
- 스트림을 사용하는 수준에서 활용하는 수준으로 올라가기 위해서 알아야 하는 API들
728x90
'야미스터디 > Java' 카테고리의 다른 글
[Java - Stream] 04. mapping (0) | 2022.12.09 |
---|---|
[Java - Stream] 03. filtering (0) | 2022.12.07 |
[Java - Stream] 01. 스트림을 학습해야 하는 이유 (0) | 2022.12.07 |
[Java] JPA 1차 캐시 📌 (1) | 2022.10.18 |
[Java] Checked Exception vs Unchecked Exception 📌 (1) | 2022.10.14 |
댓글