(자바8) 스트림

* 많은 요소를 포함하는 커다란 컬렉션의 처리?
->성능을 높이려면 멀티커오 아키텍처를 활용해서 병렬로 컬렉션의 요소를 처리해야 한다.

* 컬렉션과 스트림의 가장 큰 차이
-> 데이터를 언제 계산하느냐가 컬렉션과 스트림의 가장 큰 차이이다.
컬렉션은 현재 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조.
-> 반면 스트림은 이론적으로 요청할 때만 요소를 계산하는 고정된 자료구조.


<스트림이란 무엇인가?>


스트림을 이용하면 멀티 스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리하는 것


* 스트림에 filter, map, limit, collect로 이어지는 일련의 데이터처리 연산을 적용한다.
collect를 제외한 모든 연산은 서로 파이프라인을 형성할 수 있도록 스트림을 반환한다.


<filter>
람다를 인수로 받아 특정 요소를 제외시킨다. 
예) d -> d.getCalories() >300

<map>
람다를 이용해서 한 요소를 다른 요소로 변환하거나 정보를 추출한다.
Dish::getName(람다표현식으로는 d -> d.getName())

<limit>
정해진 개수 이상의 요소가 스트림에 저장되지 못하게 스트림 크기를 축소한다.


<collect>
스트림을 다른형식으로 변환한다.


<외부반복과 내부 반복>


컬렉션은 외부반복, 스트림은 내부반복이다.

1.  컬렉션 for-each루프를 이용한 외부반복
예) List<String> names = new ArrayList<String>();
for(Dish d: menu){
  names.add(d.getName());
}


2. 스트림 내부반복
List<String> names = menu.stream()
                                    .map(Dish::getName())
                                    .collect(toList());

--> 파이프라인을 실행한다. 반복자가 필요없다.

* 내부반복이 좋은이유
-> 작업을 투명하게 병렬로처리하거나 더 최적화된 다양한 순서로 처리한다.



< 중간연산 >
-> filter, map, limit, sorted, distinct

< 최종연산 >
-> forEach, count, collect




댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기