스트림이란?
다양한 데이터 소스를 표준화 된 방법으로 다루기 위한 것.
어떠한 데이터를 스트림으로 변환하면 같은 방식으로 데이터를 변환하고 반환한다.
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream(); // 컬렉션
Stream<String> strStream = Stream.of(new String[]("a","b","c"}); // 배열
Stream<Integer> envenStream = Stream.iterate(0, n -> n+2 ); // 람다식
Stream<Doulbe> randomStream = Stream.generate(Math::random); // 람다식
IntStream intStream = new Random().ints(5); // 난수 스트림
위와 같이 다양한 데이터 소스를 스트림으로 변환할 수 있다.
스트림을 이용해 연산을 하는 단계는 다음과 같다.
- 스트림을 만든다.
- 중간 연산을 한다. ( 0 ~ n번)
- 최종 연산을 한다. (1번)
스트림이 제공하는 기능 - 중간 연산과 최종 연산
- 중간 연산 - 연산결과가 스트림인 연산. 반복적으로 적용가능
- 최종 연산 - 연산결과가 스트림이 아닌 연산. 단 한번만 적용가능( 스트림의 요소를 소모)
Stream[] strArr = { "d", "aaa", "CC", "cc", "b"}; Stream<String> stream = Stream.of(strArr); //문자열 배열이 소스인 스트림 Stream<String> filteredStream = Stream.filter(); // 걸러내기 (중간 연산) Stream<String> distinctedStream = stream.distinct();// 중복제거 (중간 연산) Stream<String> sortedStream = stream.sort(); // 정렬 (중간 연산) Stream<String> limitedStream = stream.limit(5); // 스트림 자르기 (중간 연산) int total = stream.count(); // 요소 개수 세기 (최종 연산)
스트림의 특징
- 스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다. (Read-Only)
- 스트림은 iterator처럼 일회용이다.(필요하면 다시 트림을 생성해야 함)
- 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산
- 스트림은 작업을 내부 반복으로 처리한다. (for문 사용)
- 스트림의 작업을 병렬로 처리 가능( .parellel() 메서드 사용) - 병렬스트림
- 기본형 스트림 - IntStream, LongStream, DoubleStream
- 오토박싱&언방식의 비효율이 제거됨 (Stream대신 IntStream 사용)
- 숫자와 관련된 유용한 메서드를 Stream 보다 더 많이 제공
'Language > Java' 카테고리의 다른 글
[Java] Garbage Collection (0) | 2023.08.23 |
---|---|
멀티 쓰레드를 사용할 때 주의점과 synchroized를 활용한 쓰레드 동기화 (0) | 2023.04.08 |
문자열을 정수로 바꾸기 (0) | 2022.11.12 |
기반 스트림과 보조 스트림 (1) | 2022.11.10 |