Modern Java in Action #4

Taeyong.Hwang·2022년 3월 21일
1

Modern Java in Action

목록 보기
4/6
post-thumbnail

스트림 소개

스트림은 자바 8 API에 추가된 기능으로, 코드를 선언형으로 구현할 수 있게 해준다.
또한, 스트림을 활용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다.

스트림이란, 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소라고 한다.

  • 컬렉션과 마찬가지로 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다.
  • 데이터 제공 소스로부터 데이터를 소비한다.
  • 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산과 데이터이스와 비슷한 연산을 지원한다.

스트림은 두가지 주요 특징이 존재한다.

첫 번째는 파이프라이닝으로, 대부분의 스트림 연산은 스트림 연산끼리 연결해서 커다란 파이프라인을 구성할 수 있도록 스트림 자신을 반환한다 (메서드 체이닝)

두 번째는 내부 반복으로, 반복을 알아서 처리하고 결과 스트림값을 어딘가에 저장해주는 기능을 한다.

import static java.util.stream.Collectors.toList;

List<String> dishName =
	menu.stream()                                  // menu로부터 스트림을 얻는다.
    	.filter(dish -> dish.getCalories() > 300)  // 해당 람다식에 해당하는 것들만 통과시킨다.
        .map(Dish::getName)                        
        .limit(3)   //선착순 세 개만 선택하는데, 이를 통해 내부적으로 최적화를 수행할 수 있다.
        .collect(toList()); // 현재 예시에서,해당 메서드를 호출하기 전까지는 아무것도 수행되지 않는다. 





중간 연산과 최종 연산

List<String> names = menu.stream()
						 .filter(dish -> dish.getCalories() > 300)   //중간 연산
                         .map(Dish::getName) //중간 연산
						 .limit(3) //중간 연산
                         .collect(toList()); //최종 연산

중간 연산

중간 연산이란, 메서드의 결과값이 stream을 반환함으로써 메서드 체이닝을 유지시켜줄 수 있는 메서드들을 말합니다. 해당 연산들은 최종 연산을 수행하기 전까지는 아무 연산도 수행하지 않는다는 특징(lazy)이 있습니다.

이는 중간 연산을 순서대로 실행하는 것이 아닌 중간 연산을 합친 다음에 합쳐진 중간 연산을 최종 연산으로 한 번에 처리하기 때문인데, 이를 통해 최적화 효과를 얻을 수 있습니다. (e.g. 쇼트서킷, 루프 퓨전, ...)

최종 연산

최종 연산이란, 중간 연산을 통한 연산값을 소비하는 행위이다. 소비라는 말답게, 스트림은 단 한 번만 소비할 수 있습니다. 데이터 소스가 컬렉션같은 반복 사용가능한 소스라면 새로 스트림을 열면 되지만, I/O등이 소스라면 새로운 스트림을 만들 수 없다는 사실을 유념해야 합니다.

보통 최종 연산에 의해 List, Integer, void 등 스트림 이외의 결과가 반환됩니다.

long count = menu.stream().<중간 연산들>.count();     //개수 반환

menu.stream().<중간 연산들>.forEach(System.out::println); //void 반환

menu.stream().<중간 연산들> .collect(toList()); //리스트 반환
profile
나를 위해 정리하는 개발 블로그

0개의 댓글