스트림 역사(Stream)

기존의 Java에서 컬렉션 데이터를 처리할때 특정 조건에 따라 필터링을 하려면 복잡한 과정을 거쳐야 했다.

반면에 SQL 문법의 경우 사용자가 원하는 조건의 데이터 목록을 검색할때 명시적이고 간단한 방법을 이용했는데 

Java8 에서 새로 추가된 기능인 스트림은 Java의 컬렉션 데이터에 대해 SQL 질의문 처럼 데이터를 처리할수 있는 기능을 가지고 있다.

스트림(Stream)이란??

기존 루프문 처리의 문제점

기존 Java에서 컬렉션 데이터를 처리할때는 for, foreach 루프문을 사용하면서 컬렉션 내의 요소들을

하나씩 다루었다. 간단한 처리나 컬렉션의 크기가 작으면 큰 문제가 아니지만 복잡한 처리가 필요하거나

컬렉션의 크기가 커지면 루프문의 사용은 성능저하를 일으키게 되었다.

스트림의 등장

스트림은 Java8에서 추가된 기능으로 컬렉션 데이터를 **선언형**으로 쉽게 처리할수 있다. 

복잡한 루프문을 사용하지 않아도 되며 루프문을 중첩해서 사용해야 되는 최악의 경우도 더이상 없어졌다.

또한 스트림은 **병렬처리(Multi thread)**를 별도의 멀티스레드 구현없이도 쉽게 구현할수 있다.

사과 필터를 예제로 스트림을 사용하지 않은 방법과 사용한 방법의 코드 차이점을 확인 해보겠다.

1. 빨간색 사과 필터

2. 무게순서대로 정렬

3. 사과들의 고유번호 출력

[스트림 사용 X]

스트림을 사용하지 않을때는 각 필터링 단계마다 코드를 작성해야 한다.
// 빨간색 사과 필터링
List<Apple> redApples = forEach(appleList, (Apple apple) -> apple.getColor().equals("RED")); // 요건 메서드가 2개여서 :: 사용 불가 

// 무게 순서대로 정렬
redApples.sort(Comparator.comparing(Apple::getWeight));

// 사과 고유번호 출력
List<Integer> redHeavyAppleUid = new ArrayList<>();
for (Apple apple : redApples)
    redHeavyAppleUid.add(apple.getUidNum());

자바 ::더블콜론 이란?

[스트림 사용 O]

스트림을 사용하여 단 한줄로 표현 할수 있다.
List<Integer> redHeavyAppleUid = appleList.stream()
        .filter(apple -> apple.getColor().equals("RED"))        // 빨간색 사과 필터링
        .sorted(Comparator.comparing(Apple::getWeight))         // 무게 순서대로 정렬
        .map(Apple::getUidNum).collect(Collectors.toList());    // 사과 고유번호 출력