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(1, 5);
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(1, 100000000);
total = seq.sum();
System.out.println("순차처리: " + total);
checkExecutionTimer.setEndTime();
checkExecutionTimer.printExecutionTime();
//병렬처리
checkExecutionTimer.setStartTime();
IntStream parallel = IntStream.rangeClosed(1, 100000000).parallel();
total = parallel.sum();
System.out.println("병렬처리: " + total);
checkExecutionTimer.setEndTime();
checkExecutionTimer.printExecutionTime();
}
}
|
cs |
'Language > JAVA' 카테고리의 다른 글
[JAVA] 메모장(notepad) 만들기 ① - 인터페이스 구현 | Yoon's Dev (0) | 2021.05.25 |
---|---|
[JAVA] 스트림(Stream) 연산 옵션 타입 | Yoon's Dev (0) | 2021.05.20 |
[JAVA] JAVA 람다식을 활용한 예제 (1) | Yoon's Dev (0) | 2021.05.08 |
[JAVA] 문자(Text) 스트림, 버퍼(Buffer) 스트림, File 클래스 | Yoon's Dev (0) | 2021.04.26 |
[JAVA] JAVA의 입출력, 바이트 스트림(ByteStream) | Yoon's Dev (0) | 2021.04.24 |