<aside> ❓ 이번 챕터의 내용
</aside>
스트림의 새로운 기능이 소프트웨어공학적으로 다음의 다양한 이득을 준다.
선언형으로 코드를 구현할 수 있다. 제어블록을 사용해서 어떻게 동작을 구현할지 지정할 필요 없이 동작의수행을 지정할 수 있다.
→ 이는 기존 코드를 복사하여 붙여 넣는 방식을 사용하지 않고 람다 표현식을 이용해서 필요한 부분만 필터링하는 코드도 쉽게 구현할 수 있다는 말이다.
filter
, sorted
, map
, collect
같은 여러 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다 → 여러 연산을 파이프라인으로 연결해도 여전히 가독성과 명확성이 유지된다.
fiter 같은 연산은 고수준 빌딩 블록으로 이루어져 있다. → 즉, 스트림API 덕에 우린 데이터 처리 과정을 병렬화하면서 스레드와 락 걱정을 할 필요가 없다.
List<Dish> lowCaloricDishes = new ArrayList<>();
for (Dish dish : menu) { //누적자로 요소 필터링
if (dish.getCalories() < 400) {
lowCaloricDishes.add(dish);
}
}
Collections.sort(lowCaloricDishes, new Comparator<Dish>() {
public int compare(Dish dish1, Dish dish2) { //익명 클래스로 요리 정렬
return Integer.compare(dish1.getCalories(), dish2.getCalories());
}
});
List<String> lowCaloricDishesName = new ArrayList<>();
for (Dish dish : lowCaloricDishes) {
lowCaloricDishesName.add(dish.getName()); //정렬된 리스트를 처리하면서 요리 이름 선택
}
위의 코드에서 lowCaloricDishes
는 컨테이너 역할만 하는 중간 변수, 즉 가비지 변수.
List<String> lowCaloricDishesName =
menu.stream()
.filter(d -> d.getCalories() < 400) //400칼로리 이하의 요리 선택
.sorted(comparing(Dish::getCalories)) //칼로리로 요리 정렬
.map(Dish::getName) //요리명 추출
.collect(toList()); //모든 요리명을 리스트에 저장
stream()
을 parallelStream()
으로 바꾸면 이 코드를 멀티코어 아키텍처에서 병렬로 실행할 수 있다.
데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소