스트림
을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 멀티스레드 코드를 구현하지 않아도 데이터를 병렬로 처리할 수 있다.
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의 특징을 아래와 같이 요약할 수 있다.
스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
로 정의할 수 있다.
자료구조
이므로 컬렉션에서는 시간과 공간의 복잡성과 관련된 요소 저장 및 접근 연산이 주를 이룬다.