Language/JAVA

[JAVA] 스트림(Stream) 연산 느긋한 연산, 조급한 연산, 병렬 처리 | Yoon's Dev

Yooniron 2021. 5. 18. 22:01

JAVA 스트림(Stream) 연산 느긋한 연산, 조급한 연산, 병렬 처리

 

 


스트림 연산과 옵션 타입

 

■ 스트림 파이프라인

스트림 연산의 결과가 Stream 타입이면 연속적으로 호출 가능

스트림 연산의 연속 호출은 여러 개의 스트림이 연결되어 스트림 파이프 라인을 형성

 

 


느긋한 연산과 조급한 연산

 

■ 느긋한 연산과 조급한 연산

느긋한 연산

   . 조급한 연산이 데이터 소스에게 원소를 요구할 때까지 아무 연산도 수행하지 않고 기다리는 특징

스트림의 최종 연산조급한 연산이지만 중간 연산느긋한 연산

최종 연산이 호출되기 전까지 중간 연산은 아무런 작업을 수행하지 않음

스트림의 중간 연산이 느긋한 연산이기 때문에

   . 다운로드 방식처럼 저장 공간이 따로 필요 없음

   . 스트림 연산은 빅데이터뿐만 아니라 무한 스트림에도 대응 가능

 

StreamOperatorEx.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package lect12;
 
import java.util.stream.IntStream;
 
//Stream의 연산 방식
public class StreamOperatorEx {
 
    public static void main(String[] args) {
        IntStream is = IntStream.rangeClosed(15);
        
        is.filter( x -> {
            System.out.println("filter: " + x); // 느긋한 연산 (중간 연산)
            return x % 2 == 0;
        }).map(x -> {
            System.out.println("map: " + x); //느긋한 연산 (중간 연산)
            return x * x;
        }).forEach(x -> {
            System.out.println("forEach: " + x); // 조급한 연산(최종 연산)
        });
    }
 
}
cs

 

실행 결과

 

 

연산 과정

 


 

병렬 처리

 

■ 병렬 처리

멀티 코어 CPU를 제대로 활용하여 데이터 소스를 병렬로 처리할 수 있도록 병렬 스트림 지원

컬렉션 혹은 순차 스트림으로부터 각각 parallelStream() 혹은 parallel() 메서드를 호출하여 병렬 스트림 획득

스트림을 부분 스트림으로 분할하기 어렵거나 데이터 소스의 크기가 작거나 혹은 싱글 코어 CPU라면 오히려 성능이 나빠질 수 있음

 

ParallelStreamEx.java

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
package lect12;
 
import java.util.stream.IntStream;
 
//스트림 병렬처리
public class ParallelStreamEx {
 
    public static void main(String[] args) {
        //순차처리
        long total;
        checkExecutionTimer.setStartTime();
        IntStream seq = IntStream.rangeClosed(1100000000);
        total = seq.sum();
        System.out.println("순차처리: " + total);
        checkExecutionTimer.setEndTime();
        checkExecutionTimer.printExecutionTime();
        
        //병렬처리
        checkExecutionTimer.setStartTime();
        IntStream parallel = IntStream.rangeClosed(1100000000).parallel();
        total = parallel.sum();
        System.out.println("병렬처리: " + total);
        checkExecutionTimer.setEndTime();
        checkExecutionTimer.printExecutionTime();
        
    }
 
}
 
cs

 

실행 결과