4.1 스트림이란 무엇인가?

스트림 을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 멀티스레드 코드를 구현하지 않아도 데이터를 병렬로 처리할 수 있다.

List<String> lowCaloricDishesName - 
						menu.stream()
								.filter(d -> d.getCalories() < 400)
								.sorted(comparing(Dish::getCalories))
								.map(Dish::getName)
								.collect(toList()

stream()을 parallelStream()으로 바꾸면 위의 코드를 멀티코어 아키텍처에서 병렬로 실행할 수 있다.

List<String> lowCaloricDishesName - 
						menu.parallelStream()
								.filter(d -> d.getCalories() < 400)
								.sorted(comparing(Dish::getCalories))
								.map(Dish::getName)
								.collect(toList()

filter(or sorted, map, collect) 같은 연산은 고수준 빌딩 블록으로 이루어져 있으므로 특정 스레딩 모델에 제한되지 않고 자유롭게 어떤 상황에서든 사용할 수 있다.

Map<Dish.Type, List<Dish>> dishesByType = 
	menu.stream().collect(groupingBy(Dish::getType));

위의 코드는 Map내부의 형식에 따라 요리를 그룹화한다.

스트림 API의 특징을 아래와 같이 요약할 수 있다.


4.2 스트림 시작하기

스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소로 정의할 수 있다.