스트림
- 정의
스트림이란 순차 및 병렬적인 집계연산을 지원하는 연속된 요소입니다. 쉽게 말하면 스트림은 어떠한 데이터의 흐름이라고 생각하면 될 것 같습니다! 자바에서는 이러한 스트림에 함수형 스타일의 연산을 지원합니다.
- 구성
(1) 생성
Collection, 배열, 파일 등을 이용하여 만들 수 있습니다.
(2) 가공
중간 연산자를 통해서 새로운 스트림을 만들어내는 과정입니다. 중간 연산을 하는 과정에서 lazy evaluation을 하는데, 스트림에서 lazy evaluation이란 최종 연산이 들어오기 전까지 중간 연산은 실제로 실행되지 않음을 의미합니다. 이를 통해 루프 퓨전과 쇼트 서킷을 활용할 수 있습니다.
루프 퓨전이란 모든 요소가 한 단계씩 거치는 것이 아니라 하나의 요소가 순차적으로 모든 단계를 거치고 난 뒤 다른 요소가 실행되는 것입니다.
public static void loopFusion(){
List<String> names = List.of("1111", "22", "33", "4444");
names.stream()
.filter(str -> {
System.out.println("first filter = "+str);
return str.length() > 3;
})
.filter(str -> {
System.out.println("second filter = "+str);
return str.contains("1111");
})
.forEach(str -> {
System.out.println("forEach = "+str+"\n");
});
}
/*
결과
first filter = 1111
second filter = 1111
forEach = 1111
forEach = 22
forEach = 33
first filter = 4444
forEach = 4444
*/
쇼트 서킷이란 일련의 논리 연산을 수행할 때, 모든 연산을 수행하지 않고 결과가 확실한 경우 나머지 연산을 수행하지 않는 것을 의미, 스트림에서의 쇼트 서킷 또한 일련의 연산 중 더 이상 진행하지 않아도 되는 연산은 수행하지 않는 것을 의미합니다.
아래의 예시를 보면 range는 10000000이지만 limit이 5이기 때문에 5번 수행하고나서 더이상 수행하지 않습니다.
private static void shortCircuit(){
IntStream.range(0, 10000000)
.limit(5)
.map(i -> i + 100)
.forEach(i -> System.out.println("result = "+i));
}
/*
결과
result = 100
result = 101
result = 102
result = 103
result = 104
*/
또한 중간 연산자는 Stateless, Stateful로 구분할 수 있습니다.
Stateless는 특정 행위를 수행할 때 다른 요소에 대해서 독립적으로 수행됨을 의미합니다. ex) filter, map, peek 등
Stateful는 선행된 연산에 영향을 받는 것을 의미합니다. ex) sorted, distinct, limit 등
(3) 소비
결과를 생성하거나 사이드 이펙트를 만들기 위해서 사용됩니다. ex) collect, findAny, findFirst 등
정리 정말 잘 되어 있는 곳!!!
[Java] Stream API의 활용 및 사용법 - 기초 (3/5) - MangKyu's Diary (tistory.com)
- 장단점
(1) 장점
가독성이 좋습니다.
유연합니다. = 코드 변경이 쉽습니다.
병렬처리가 쉽습니다.
(2) 단점
컴퓨팅 비용이 많이 듭니다.
인지에 대한 비용이 듭니다.
'기타 > 스터디' 카테고리의 다른 글
[스터디1] 싱글턴 패턴과 정적 메소드 (1) | 2022.06.08 |
---|