스트림이란?
자바 8에 추가된 기능으로 멀티스레드 코드를 이용하지 않아도 간단하게 병렬로 처리하는 어플리케이션을 구현할 수 있다.
자바8 이전과 이후의 차이
java7
//자바 8 이전 - 2020년 이후 발행된 책을 연도순으로 정렬하여 책 이름을 반환
private static List<String> getBooksNameSortedByYearAfter2020(List<Book> books) {
//2020년 이후 책
List<Book> booksAfter2020 = new ArrayList<>();
for (Book book : books) {
if (book.getYear() >= 2020) {
booksAfter2020.add(book);
}
}
//연도순 정렬
Collections.sort(booksAfter2020, new Comparator<Book>() {
@Override
public int compare(Book book1, Book book2) {
return Integer.compare(book1.getYear(), book2.getYear());
}
});
List<String> booksNameAfter2020 = new ArrayList<>();
for (Book book : booksAfter2020) {
booksNameAfter2020.add(book.getName());
}
return booksNameAfter2020;
}
중간에 2020년 이후 책들만 가져오기 위해 booksAfter2020이라는 가비지 변수를 사용하였다.
이를 java8에서는 스트림을 사용하여 어떻게 작성할 수 있는지 알아보자
java8
//자바 8 이후 - 2020년 이후 발행된 책을 연도순으로 정렬하여 책 이름을 반환
private static List<String> getBooksName2(List<Book> books) {
//2020년 이후 책
List<String> collect = books.stream()
.filter(book -> book.getYear() >= 2020)
.sorted(comparing(Book::getYear))
.map(Book::getName)
.collect(Collectors.toList());
return collect;
}
stream()을 parallelStream()으로 바꾸면 병렬로 실행할 수도 있다.
위 코드에서 filter, sorted, map, collect 같은 여러 빌딩 블록으로 연결해서 가독성과 명확성도 유지되며 특정 스레딩 모델에 제한되지 않고 어떤 상황에서든 사용할 수 있다.
스트림의 간단한 특징
- 선언형 : 더 간결하고 가독성이 좋아진다.
- 조립할 수 있음: 유연성이 좋아진다.
- 병렬화: 성능이 좋아진다.
스트림과 컬렉션
스트림과 컬렉션 모두 연속된 요소 형식의 값을 저장하는 자료구조의 인터페이스를 제공한다.
스트림과 컬렉션 비교
스트림
- 이론적으로는 요청할 때만 요소를 계산하는 고정된 자료구조
- 사용자가 데이터를 요청할 때만 값을 생성
- 한 번만 조회 가능
컬렉션
- 현재 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조
- 컬렉션의 모든 요소는 추가하기 전에 계산
- 여러 번 조회 가능
외부 반복과 내부 반복
- 컬렉션을 사용하려면 사용자가 for-each를 통해 직접 요소를 반복해야 하는데 이를 외부 반복이라고 한다.
- 스트림은 반복을 알아서 처리하고 결과 스트림값을 어딘가에 저장해주는데 이를 내부 반복이라고 한다.
- 내부 반복은 작업을 투명하게 병렬로 처리하거나 최적화된 다양한 순서로 처리할 수 있게 해준다.
스트림 연산
스트림은 크게 연결할 수 있는 중간 연산과 파이프라인을 실행한 후 스트림을 닫는 최종 연산으로 구분된다.
중간 연산
위의 스트림 예제에서 나온 filter, sorted, map 그리고 등장하지 않은 limit, distinct등이 중간 연산이다.
최종 연산
위의 스트림 예제에서 연산 결과를 List로 만들어준 collect는 최종 연산으로 파이프라인에서 결과를 도출한다. 그 외에도 forEach, count 등이 있다.
스트림 이용하기
- 질의를 수행할 데이터 소스
- 스트림 파이프라인을 구성할 중간 연산
- 스트림 파이프라인을 실행하고 결과를 만들 최종 연산
참고문서
모던 자바 인 액션 - 라울 게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로소포트
'프로그래밍 > Book' 카테고리의 다른 글
[모던 자바 인 액션] 7장. 병렬 데이터 처리와 성능 (0) | 2022.02.21 |
---|---|
[모던 자바 인 액션] 6장. 스트림으로 데이터 수집 (0) | 2022.02.09 |
[모던 자바 인 액션] 5장. 스트림 활용 (0) | 2022.02.06 |
[모던 자바 인 액션] 3장. 람다 표현식 (0) | 2022.01.28 |
[모던 자바 인 액션] 2장. 동작 파라미터화 (0) | 2022.01.24 |