다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것.
스트림을 사용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 다룰수 있다.
(코드가 간결하고 이해하기 쉬우며 재사용성도 높아진다)
List<Integer> list = Array.asList(1,2,3,4,5);
Stream<Integer> intStream = list.stream(); // 컬렉션
Stream<String> strStream = Stream.of(new String[]{"a","b","c"}); // 배열
Stream<Integer> evenStream = Stream.iterate(0, n->n+2); // 0,2,4,6, ...
Stream<Double> randomStream = Stream.generate(Math::random); // 람다식
IntStream intStream = new Random().ints(5); // 난수 스트림 (크기 5)
스트림의 연산
스트림이 제공하는 다양한 연산을 이용해서 복잡한 작업들을 간단히 처리할 수 있다.
중간 연산
연산 결과가 스트림인 연산으로, 스트림에 연속해서 중간 연산을 할 수 있다.
최종 연산
연산 결과가 스트림이 아닌 연산으로, 스트릶의 요소를 소모하므로 단 한번만 가능하다.
* 최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다. 최종 연산이 수행되어야 비로소 스트림의 요소들이 중간 연산을 거쳐 최종 연산에서 소모된다.
String[] strArr = {"aa", "bb", "CC", "cc", "d"};
Stream<String> stream = Strem.of(strArr); //문자열 배열이 소스인 스트림
Stream<String> filteredStream = stream.filter(); //걸러내기(중간 연산)
Stream<String> distinctedStream = stream.distinc(); //중복제거(중간 연산)
Stream<String> sortedStream = stream.sort(); //정렬(중간 연산)
Stream<String> limitedStream = strem.limit(5); //스트림 자르기(중간 연산)
int total = stream.count(); //요소 개수 세기(최종 연산)
스트림의 특징
데이터 소스를 변경하지 않는다
스트림은 데이터 소스로부터 데이터를 읽기만할 뿐, 데이터 소스를 변경하지 않는다.
일회용이다.
한번 사용하면 닫혀서 다시 사용할수 없다. 필요하다면 스트림을 다시 생성해야 한다.
작업을 내부 반복으로 처리한다.
내부 반복은 반복문을 메서드의 내부에 숨길수 있다는 것으로, 스트림에 정의된 forEach()는 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용한다.
스트림의 작업을 병렬로 처리 - 병렬 스트림
스트림은 내부적으로 fork&join프레임워크를 이용해서 자동적으로 연산을 병렬로 수행한다.
parellel()메서드를 호출해서 병렬로 연산을 수행하도록 하면 된다.
int sum = strStream.parallel() //strStrem을 병렬 스트림으로 전환
.mapToInt(s -> s.length()).sum();
728x90
'Language > Java' 카테고리의 다른 글
15-2. 스트림의 중간 연산 (0) | 2021.08.05 |
---|---|
15-1. 스트림 만들기 (0) | 2021.08.04 |
14. java.util.function 패키지 (0) | 2021.08.04 |
13. 람다(Lambda) (0) | 2021.08.04 |
12.4 쓰레드(Thread) - Lock과 Condition을 이용한 동기화 (0) | 2021.07.29 |