스트림(Stream)이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소로 정의할 수 있는 기능이다.
많은 수의 데이터를 다룰 때, 컬렉션이나 배열에 데이터를 담아 원하는 결과 도출을 위해 for문과 Iterator를 이용해서 코드를 작성하는 방식이 있다.
이 방식의 단점은 코드 길이가 매우 길어지고 알아보기도 쉽지 않기 때문에 가독성 및 재사용성이 떨어진다는 것이다.
이를 해결하기 위해 스트림이 등장하게 되는데 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메소드들을 정의한 인터페이스인 것이다.
연속된 요소?
소스?
Collection, Array, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비한다.데이터 처리 연산?
순차적으로 혹은 병렬 처리로 실행이 가능하다.String[] arr = {"aaa","bbb","ccc"}; // 배열 초기화
List<String> list = Arrays.asList(arr); // 리스트에 배열 원소들 저장
Stream<String> stream1 = list.stream();
Stream<String> stream2 = Arrays.stream(arr);
스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐,
데이터 소스를 변경하지 않는다는 특성이 있다. 필요 시에 정렬된 결과를 컬렉션이나 배열에 담아 반환할 수 있다.
List<String> list = stream2.sorted().collect(Collectors.toList());
스트림이 제공하는 연산 과정은 중간 연산과 최종 연산으로 분류된다. 중간 연산은 연산결과를 스트림으로 반환하기 때문에 중간 연산을 연속해서 연결 할 수 있다. 하지만 최종 연산은 스트림의 요소를 소모하면서 연산을 수행하는 것이므로 단 한번만 연산이 가능하다.
여기서 lazy하다는 말은 최종 연산이 나오기 전까지는 실행하지 않는 것을 뜻합니다.
각 연산 과정에 포함된 메서드를 잘 숙지하고 적용하자
docs:
https://incheol-jung.gitbook.io/docs/q-and-a/java/stream