Stream
업데이트:
데이터 컬렉션 반복을 멋지게 처리하는 기능이다.
자바8에서 추가된 기능으로써 멀티스레드 코드 없이 데이터를 병렬로 처리 가능하다.
스트림의 특징
- 선언형 : 더 간결하고 가동성이 높아짐
- 조립할 수 있음 : 유연성이 좋아진다.
- 병렬화 : 성능이 좋아진다.
스트림 시작하기
데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
- 연속된 요소
- 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공
- filter, sorted, map처럼 표현 계산식이 주를 이룸
- 스트림의 주제는 계산이다.
- 소스
- 제공된 소스로부터 데이터를 사용, 즉 스트림을 생성하면 정렬이 그대로 유지
- 데이터 처리 연산
- 데이터베이스와 비슷한 연산을 지원
- 순차적으로 또는 병렬로 실행 가능
- 파이프라이닝
- 스트림 자신을 반환 가능, 스트림 연산끼리 연결할 수 있다(파이프라인 구성)
- 게으름, 쇼트서킷과 같은 최적화 가능
- 내부 반복
- 컬렉션과 달리 스트림은 내부 반복을 지원
public static List<String> threeHighCaloricDishNames =
menu.stream()
.filter(dish -> dish.getCalories() < 400)
.map(Dish::getName)
.limit(3)
.collect(toList());
}
스트림과 컬렉션
컬렉션
- 적극적 생성(생산자 중심)
- 모든 요소는 컬렉션에 추가하기 전에 계산되어야 한다.
- 연산을 수행할때마다 변경점과 추가 요소가 미리 계산되어야 함
스트림
- 게으른 생성(요청 중심, 즉석 제조)
- 요청할 때만 요소를 계산
- 스트림에서 요소를 추가하거나 제거할 수 없음
- 스트림은 일회성이다.(한번 쓰면 다시 사용할 수 없음)
외부 반복과 내부 반복
외부 반복(컬렉션)
- 병렬성을 스스로 관리(for-each)
내부 반복(스트림)
- 반복을 내부에서 처리하고 결과를 반환
- 개발자가 반복자나 반복 과정을 신경쓰지 않아도 됨
- 작업을 투명하게 병렬로 처리하거나 최적화된 다양한 순서로 처리할 수 있게 해줌
스트림 연산
중간 연산과 최종 연산이 존재
중간 연산
- 연결할 수 있는 스트림 연산
- filter, map, limit 등등
- stream을 반환
최종 연산
- 스트림을 닫는 연산
- void, List, Integer 등등
- stream 이외의 결과를 반환
스트림 이용하기
스트림 이용 과정
- 질의를 수행할 (컬렉션) 데이터 소스
- 스트림 파이프라인을 구성할 중간 연산 연결
- 스트림 파이프라인을 실행하고 결과를 만들 최종 연산
다음에는 어떤 연산들이 있는지 더 알아보고 내가 주로 사용하는 연산에 대해 소개하겠다.
참고
모던 자바 인 액션 Chapter.4
댓글남기기