본문 바로가기

Java/Java8 in Action

자바8 - 4장.스트림 소개 (Stream)

책을 읽기전에

나는 자바8 스트림 API 사용법만 찾아보고 제대로 된 이해를 하지 않았다. 그래서 책을 읽게 되었고 자세히 알아보려 한다.

자바에서 많이 사용되는 것 중 하나가 컬렉션이다.

  • SQL WHERE 절과 같은 역할을 자바에서 한다면?
  • 커다란 컬렉션을 자바에서 어떻게 효율적으로 처리할까?

1. 스트림이란 무엇인가?

스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다.

List<String> lowCaloricDishesName =
	menu.stream()
    	.filter(d -> d.getCalories() < 400)
        .sorted(comparing(Dishes::getCalories))
        .map(Dish::getName)
        .collect(toList());
  • 선언형으로 코드 구현 -> 변하는 요구사항에 쉽게 대응할 수 있음
  • 데이터 처리 파이프라인을 만들 수 있다. -> 가독성, 명확성

2. 스트림 시작하기

스트림에는 두가지 특징이 있다.

  • 파이프라이닝 : 커다란 파이프라인을 구성할 수 있다 -> laziness, short-circuiting 같은 최적화도 얻을 수 있음 ( 5장에서 설명 )
                           데이터베이스 질의와 비슷
  • 내부반복

스트림 연산의 종류

  • filter
  • map
  • limit
  • collect

다음 포스팅에서 자세한 API 사용방법을 살펴보고 지금은 컬렉션 API와 스트림 API의 개념적인 차이를 알아보자.

 

3. 스트림 vs 컬렉션

내부반복 vs 외부반복

 

4. 스트림 연산

List<String> names = menu.stream()   // 메뉴에서 스트림을 얻는다.
                        .filter(d -> d.getCalories() > 300) // 중간연산
                        .map(Dish::getName) // 중간연산
                        .limit(3)   // 중간연산
                        .collect(toList()); // 스트림을 리스트로 변환