티스토리 뷰
자바 8에는 다양한 기술들을 살펴보려고 하는데, 그 다섯 번째는 Stream이다.
- 데이터를 담고 있는 저장소(컬렉션)이 아니다.
- 연속된 데이터를 처리하는 operation의 모임이라고 생각하면 된다.
- 스트림으로 처리하는 데이터 소스를 변경하지 않는다.
- 즉, 어느 컬렉션에 스트림 API를 쓰더라도 컬렉션 내 데이터는 변경되지 않는다.
- 스트림 API를 중개 오퍼레이션과 종료 오퍼레이션이 존재한다.
- 중개 오퍼레이션이 lazy하다는 의미는 종료 오퍼레이션이 실행될 때까지 중개 오퍼레이션은 실행을 하지 않는다. ⇒ 중개 오퍼레이션은 정의만 한다고 생각하면 된다.
- 손쉽게 병렬 처리가 가능하다.
- 스레드를 만들고 병렬처리하는 + 컨텍스트 스위칭을 고려할 때에는 더 오래 걸릴 수 있다.
- 엄청 방대한 데이터일 경우에만 사용하자.
- 소스와 처리하는 데이터에 따라 다르므로 성능 체크를 한 후 사용하는 것이 제일 좋다.
중개 오퍼레이션의 lazy 예시
import java.util.*;
public class App {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("eric");
names.add("kwon");
names.add("toby");
names.add("spring");
names.stream().map((str) -> {
System.out.println(str);
return str.toUpperCase();
});
System.out.println("==========구분자========");
}
}
// 출력 결과
==========구분자========
위 코드에서 보다시피 종료 오퍼레이션이 없는 코드는 출력이 이루어지지 않는다.
즉, 실행이 안 된다고 볼 수 있다.
다음 코드는 종료 오퍼레이션을 추가한 코드이다.
import java.util.*;
import java.util.stream.Collectors;
public class App {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("eric");
names.add("kwon");
names.add("toby");
names.add("spring");
List<String> namesUsedStream = names.stream().map((str) -> {
System.out.println(str);
return str.toUpperCase();
}).collect(Collectors.toList());
System.out.println("==========구분자========");
System.out.println(namesUsedStream.toString());
}
}
// 출력 결과
eric
kwon
toby
spring
==========구분자========
[ERIC, KWON, TOBY, SPRING]
스트림 파이프라인
- 0개 또는 다수의 중개 오퍼레이션과 한 개의 종료 오퍼레이션으로 구성한다.
- 스트림의 데이터 소스는 오직 종료 오퍼레이션을 실행할 때에만 처리한다.
중개 오퍼레이션
ex) filter, map, limit, skip, sorted ...
종료 오퍼레이션
ex) collect, allMatch, count, forEach, min, max ...
위 내용은 effective-java 아이템[45]에도 자세히 나온다.
책에서 소개하는 스트림이 아주 안성맞춤인 상황이다.
- 원소들의 시퀀스를 일관되게 변환한다.
- 원소들의 시퀀스를 필터링한다.
- 원소들의 시퀀스를 하나의 연산을 사용해 결합한다.
- 원소들의 시퀀스를 컬렉션에 모은다.
- 원소들의 시퀀스에서 특정 조건을 만족하는 원소를 찾는다.
스트림으로 처리하기 어려운 대표적인 예는 한 데이터가 파이프라인의 여러 단계를 통과할 때 이 데이터의 각 단계에서의 값들에 동시에 접근하기는 어려운 경우이다.
스트림의 각 변환 단계는 함수형 인터페이스에서 언급한 순수함수여야 한다.
'JAVA > JAVA8' 카테고리의 다른 글
자바 8에 추가된 기술 [7] 시간 API (0) | 2022.02.06 |
---|---|
자바 8에 추가된 기술 [6] Optional (0) | 2022.02.05 |
자바 8에 추가된 기술 [4] deafult 메서드와 static 메서드 (0) | 2022.01.22 |
자바 8에 추가된 기술 [3] 메서드 레퍼런스 (0) | 2022.01.22 |
자바 8에 추가된 기술 [2] 람다 표현식 (0) | 2022.01.21 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- kkoon9
- 이팩티브 자바
- 디자인 패턴
- C++
- Kotlin
- BOJ
- Olympiad
- 프로그래머스
- 클린 코드
- 정규표현식
- JPA
- Spring
- kotest
- 테라폼
- BAEKJOON
- Java
- Spring Boot
- 객체지향
- Algorithm
- 클린 아키텍처
- node.js
- 코테
- 알고리즘
- programmers
- AWS
- MSA
- 백준
- 이펙티브 자바
- Effective 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 | 30 |
글 보관함