<aside> ❓ 이번 챕터의 내용

</aside>

스트림이란 무엇인가 ?

성능 이득

스트림의 새로운 기능이 소프트웨어공학적으로 다음의 다양한 이득을 준다.

  1. 선언형으로 코드를 구현할 수 있다. 제어블록을 사용해서 어떻게 동작을 구현할지 지정할 필요 없이 동작의수행을 지정할 수 있다.

    → 이는 기존 코드를 복사하여 붙여 넣는 방식을 사용하지 않고 람다 표현식을 이용해서 필요한 부분만 필터링하는 코드도 쉽게 구현할 수 있다는 말이다.

  2. 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()으로 바꾸면 이 코드를 멀티코어 아키텍처에서 병렬로 실행할 수 있다.

두 코드 비교 후, 스트림 API 특징

스트림이란

데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소