티스토리 뷰

JAVA

3. 스트림 연산

박중수 2015. 3. 31. 18:55

보통 요소들의 집합에서 원하는 값들을 추출해낼 때에는 반복문을 돌려 값을 가져오곤 한다.


여태까지는 String의 리스트에서 Park으로 시작하는 문자열들을 개수를 세려면 아래와 같았다.


List<String> list = .... // 값이 들어있다.

int count = 0;

for(int i=0; i<list.size(); i++)

count++;



하지만 스트림 연산을 사용하면 아래와 같이 바꿀 수 있다.


int count = list.stream().filter(str->str.startsWith("Park")).count();


stream() 메소드는 배열의 스트림을 리턴한다. 그 스트림의 filter 메소드는 내부에 들어있는

람다 표현식에 들어있는 조건에 부합하는 결과만 담아 새로운 스트림을 리턴한다.


리턴된 새로운 스트림에서 count 메소드를 호출하여 그 스트림의 결과값 개수를 얻는 것이다.


중요한 점은 stream() 메소드도 Stream 객체를 리턴하고 filter() 메소드도 Stream 객체를 리턴한다.

계속 새로운 Stream을 리턴하는 이유는 무엇일까.


일단 Stream의 작업단계를 살펴보면

1. 스트림을 생성한다

2. 초기 스트림을 다른 스트림으로 변환하는 중간연산들을 하나 이상의 단계로 지정한다.

3. 최종연산을 적용한다. 최종연산을 적용하게 되면 이전의 지연연산들을 강제로 실행한다.



★ 중간연산이란 위 예제의 filter 라던지 distinct 같은 결과 값들을 골라내는 작업이다.

    (Stream을 리턴하는 메소드들은 중간연산이라고 봐도 무방하다.)



★ 최종연산이란 count, forEach 처럼 중간연산을 거쳐 나온 결과를 사용하기 위해 쓰는 연산이다.

    또한 최종연산 메소드가 수행되고 나면 그 스트림은 쓰레기가 된다. 심지어 재활용 안돼는 쓰레기에

    불타지도 않는 쓰레기라 쓰레기차(가비지컬렉션)가 가져갈때까지 그냥 두면 된다.


ex) 

Stream<String> stream = list.stream().filter(str->str.startsWith("Park"));

int count = stream.count();

count = stream.count(); // 이곳은 에러이다. 한번 최종연산을 한 스트림은 다신 못쓴다. 

(재활용 불가 쓰레기)


★ 스트림 연산은 요소를 대상으로 실행될 때 호출된 순서대로 실행되지 않는다.(무작위)


★ 스트림 연산은 어떤 순서로 어떤 스레드에서 작업을 하는지 명시하지 않는다.

    다만 무슨 작업을 하는지만 명시하면 어떻게 어떤 순서로 작업할건지는 스트림에서 처리한다.




'JAVA' 카테고리의 다른 글

[Rambda] 람다표현식 안에서 전역변수 이용하기  (0) 2015.03.31
4. Stream의 병렬화  (0) 2015.03.31
2. Stream의 특징  (0) 2015.03.31
[Rambda] List 인터페이스의 forEach 메소드  (0) 2015.03.31
1. Stream 이란?  (0) 2015.03.31
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함