Stream API를 사용하여 코드를 짜면 가독성에 좋고, Optional 클래스와 같이 java8 버전 이후 나온 기술 중 최근 현업에서 많이 사용하는 듯하다. 면접 질문에서도 심심찮게 질문을 받아볼 수 있었고, 정리해두고 사용할때마다 참고하고자 한다. 또한, 부족한 부분들을 추가하며 만들어가자.
Stream 생성하기 - 스트림 생성
Stream 가공하기 - 중간 연산자
Stream 결과 만들기 - 최종 연산자
// 스트림 생성 -> 중간 연산자 -> 최종 연산자
int result = list.stream() // 스트림 생성
.filter( ... ) // 중간 연산자
.map( ... ) // 중간 연산자
.count(); // 최종 연산자
자바 8 이전에 for, if 문을 사용해서 객체들을 다루었다면 자바 8 이후에 추가된 기능으로, stream 형태의 요소에 함수형 연산자를 지원해주는 클래스이다.
그래서 Stream이 뭔데?
스트림은 '데이터 흐름'입니다.
배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있습니다. 또한 람다를 이용해서 코드의 양을 줄이고 가독성 좋은 코드로 표현할 수 있습니다. 즉, 배열과 컬렉션을 함수형으로 처리할 수 있습니다.
또 하나의 장점은 간단하게 병렬처리(multi-threading)가 가능하다는 점입니다. 하나의 작업을 둘 이상의 작업으로 잘게 나눠서 동시에 진행하는 것을 병렬 처리(parallel processing)이라고 합니다. 즉 쓰레드를 이용해 많은 요소들을 빠르게 처리할 수 있습니다.
재사용하면 다음과 같은 에러가 발생한다.
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
병렬 스트림은 여러 쓰레드가 작업한다.
중개 연산은 미리하지 않는다. 지연 연산을 한다.(나중에 최종연산(forEach, .. )가 실행될 때 같이 실행된다. 이로써 미리 계산하면서 두번 순회하는 것을 안할 수 있게 된다.