이번엔 Java에 존재하는 고급 기능 중 하나인 Stream 에 대해 알아보자.
Stream은 Java 8 부터 등장하게 된 편의 기능이다.
원래는 Collection이나 배열을 다루기 위해선, Iterator 구문을 돌렸어야 했다.
하지만 Code가 너무 길어져서, Stream이라는 편의 메서드가 등장하게 된다.
간편하게 메서드 체인을 통해서 Loop을 돌리고 원하는 결과를 생성할 수 있다.
그리고 또 하나의 장점은 간단하게 병렬처리가 가능하다는 점이다.
그 말인 즉슨, 하나의 작업을 둘 이상의 작업으로 나눠 동시 진행이 가능하다는 것이다.
그리고 Stream과 함께 람다(Lambda) 함수를 사용할 수 있음이 특징이다.
Stream의 처리 과정
Stream의 처리 과정은 아래와 같다.
- Stream 생성하기
- Stream 내부 요소 가공하기(Filtering)
- 결과 만들어 내기
Stream 생성하기
Stream은 Collection 인스턴스를 통해 생성할 수도 있고, 직접 생성할 수도 있다.
Parallel Stream
Stream을 병렬 작업으로 쓰레드처럼 처리 가능한 Parallel Stream이 존재한다.
.stream()
대신에 .parallelStream()
을 사용하면, 병렬 스트림을 사용할 수 있다.
병렬 작업을 하므로, 작업의 효율에 있어서 이득이 있을 수 있지만, 반드시 좋은 것은 아니다.
Stream 가공하기
아래로는 이렇게 Product 라는 Class를 만들어 진행하도록 하겠습니다.
- Flat Mapping ?
map
과 다른 flatMap
메서드는, 고차원 배열을 1차원으로 줄여준다.
또한 Stream<Generic>
의 형태로 반환되는 map
과 달리, 기본형으로 반환을 해줄 수 있다.
Stream 결과 도출
- Primitive Type 연산
flatMap
에서도 확인했듯이, 기본형 타입은 연산 메서드가 이용 가능하다.
- Stream Reduce
reduce
를 통한 연산은 기본형 타입이 아니더라도 가능하다.
reduce
는 총 3가지의 Parameter로 구성되어 있다.
- Identity : 연산의 초기 값을 설정한다.
- Accumulator : 연산 로직이 들어간다.
- Combiner : Parallel 스트림에서 나눠진 계산 값을 하나로 합친다.
- Stream Collecting
연산이 아닌, Stream의 형태를 바꿀 수 있는 종료 메서드이다.
Collectors
타입의 인자를 받아서 처리를 한다.