모던 자바 인 액션 - 스트림

WoohoPark·2022년 10월 31일
0

모던자바인액션

목록 보기
2/2

스트림

1-1. 스트림이란?

스트림(stream)이란 자바 8 API에 추가된 기능으로 선언형으로 컬렉션 데이터 처리할 수 있다.
좀 더 풀어서 정의하면 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소이다.
내부 반복으로 동작을 구현 하며, 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다.
스트림은 컬렉션과 유사하게 특정 형식의 요소로 이루어진 연속된 값 집합의 인터페이스를 제공한다.

1-2. 스트림 특징

  • 파이프라이닝: 대부분의 스트림 연산은 스트림 자신을 반환한다. 따라서 스트림 연산을 연결해서 커다른 파이프라인을 구성할 수 있다.

  • 내부 반복: 컬렉션은 반복자를 명시적으로 반복하는 반면 스트림은 내부 반복을 지원한다. 내부 반복을 이용하면 작업을 투명하게 병렬로 처리하거나 더 최적화된 다양한 순서로 처리가 가능하다.

  • 탐색 1회성만 가능: 탐색된 스트림의 요소는 소비되기 때문에 한 번만 소비할 수 있다.

1-3. 컬렉션과 스트림

DVD에 어떤 영화가 저장되어 있다면 DVD에 전체 자료구조가 저장되어 있으므로 DVD도 컬렉션이다.
하지만, 인터넷 스트리밍으로 같은 비디오를 시청한다면? 스트리밍, 즉 스트림이다.
스트리밍으로 재생할 때는 사용자가 시청하는 부분의 프레임만 미리 내려받는다.
즉, 데이터를 언제 계산하느냐가 컬렉션과 스트림의 가장 큰 차이다.

컬렉션 : 현재 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조, 모든 요소는 추가 전 계산되어야 함
스트림 : 요청할 때만 요소를 계산하는 고정된 자료구조, 요청하는 값만 스트림에서 추출하는 것, 게으르게 만들어지는 컬렉션

1-4. 스트림 연산

  • 중간 연산
    중간 연산은 다른 스트림을 반환하기 때문에 중간 연산을 연결해서 질의를 만들 수 있다. 중간 연산의 중요한 특징은 단말 연산을 파이프라인에 실행하기 전까지는 아무 연산도 수행하지 않는다는 것, 즉 게으르다 는 것이다. 중간 연산들은 합친 다음, 최종 연산으로 한 번에 처리한다.

  • 최종 연산
    최종 연산은 스트림 파이프라인에서 결과를 도출한다. 보통 이 때 List, Integer, void 등이 반환된다.

List<String> names = menu.stream() //스트림 얻기
                         .filter(d -> d.getCalories() > 300) //중간 연산
                         .map(Dish::getName) //중간 연산
                         .limit(3) //중간 연산
                         .collect(toList())); //스트림을 리스트로 변환 (최종 연산)
profile
안녕하세요.

0개의 댓글