Stream
- 스트림은 자바 8부터 추가된 기능으로 컬렉션(배열)의 저장 요소들을 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다.
- 스트림은 Iterator와 비슷한 역할을 하지만 람다식으로 요소 처리 코드를 제공할 수 있고,
내부 반복자를 사용해서 병렬 처리(멀티 스레드 활용), 중간 처리, 최종 처리 작업을 수행할 수 있다는 점이 다르다.
- 스트림은 컬렉션 요소에 대해서 중간 처리와 최종 처리를 할 수 있다.
- 중간 처리에서는 반복, 매핑, 필터링, 정렬 등을 수행한다.
- 최종 처리에서는 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행한다.
- java.util.stream 패키지에 존재하고 BaseStream 인터페이스를 부모로 해서 자식 인터페이스들이 상속 관계를 이루고 있다.
- 종류 : Stream, IntStream, LongStream, DoubleStream
[중간 처리 메소드와 최종 처리 메소드를 쉽게 구분하는 방법!] * 반환 값(리턴 타입)을 보면 쉽게 구분이 가능하다. * 리턴 타입이 Stream이라면 중간 처리 메소드이고, -> 메소드들을 스트림 파이프라인 이용 가능. * 리턴 타입이 기본 타입이거나 void, OptionalXXX 이면 최종 처리 메소드이다. |
스트림의 생성
1) 컬렉션으로부터 스트림 얻기
: 컬렉션에 있는 stream() 이라는 메소드로부터 얻어올 수 있다. (java.util.Collection.stream())
2) 배열로부터 스크림 얻기
: Arrays.stream(배열) 메소드로부터 얻어오거나 각 스트림(Stream, IntStream, ...)에 존재하는 of() 메소드를 통해서 얻어올 수 있다.
3) 숫자 범위로 스트림 얻기
: IntStream의 range(), rangeClosed() 메소드를 이용해서 첫 번째 매개 값부터 두 번째 매개 값까지 혹은 이전까지 제공하는 스트림을 얻어올 수 있다.
중간 처리 종류
◆ 필터링(Filtering)
- 중간 처리 기능으로 요소를 걸러내는 역할을 한다.
◇ distinct()
: 중복을 제거하는 메소드, Stream의 경우 Object.equals()가 true를 리턴하면 동일 객체로 판단한다.
◇ filter(Predicate)
: 매개 값으로 전달되는 Predicate가 false를 리턴하는 요소를 제거한다. (요소 별로 람다식을 태워서 하나하나 판단한다.)
◆매핑(Mapping)
- 중간 처리 기능으로 스트림의 요소를 다른 요소로 대체하는 작업을 말한다.
◇ mapXXX()
: 요소를 대체하는 요소로 구성된 새로운 스트림을 생성한다.
◇ flatMapXXX()
: 하나의 요소를 복수의 요소들로 구성된 새로운 스트림을 생성한다.
◇ asDoubleStream()
: IntStream, LongStream -> DoubleStream으로 변환해서 리턴해주는 메소드
◇ asLongStream()
: IntStream, LongStream -> LongStream으로 변환해서 리턴해주는 메소드
◇ boxed()
: int, long, double 요소를 Integer, Long, Double 요소로 박싱해서 스트림을 생성한다.
◆ 정렬(Sorted)
- 스트림은 요소가 최종 처리되기 전에 중간 단계에서 요소를 정렬해서 최종 처리 순서를 변경할 수 있다.
- Stream<T>는 요소 객체가 Comparable을 구현하지 않을 경우 예외가 발생한다.
- IntStream, LongStream, DoubleStream은 요소를 오름차순으로 정렬한다.
◆ 루핑(Looping)
요소 전체를 반복하는 것을 말한다.
◇ peek()
- 중간 처리 단계에서 전체 요소를 반복하면서 추가적인 작업을 하기 위해 사용한다.
- 최종 처리 메소드가 호출되어야 동작한다. (모든 중간 처리 메소드에 적용된다.)
◇ forEach()
- 최종 처리 단계에서 전체 요소를 반복하면서 추가적인 작업을 하기 위해 사용한다.
- 최종 처리 메소드이기 때문에 이후에 sum()과 같은 다른 최종 처리 메소드를 호출할 수 없다.
'Programming > Java' 카테고리의 다른 글
DAY 101. JAVA - 스트림(Stream) 최종 처리 메소드 종류 (0) | 2021.11.27 |
---|---|
DAY 99. JAVA - 람다식(lambda) 표준 함수적 인터페이스 종류 (0) | 2021.11.25 |
DAY 98. JAVA - 람다식(lambda) (0) | 2021.11.25 |
DAY 33. [JAVA] 변수 (0) | 2021.09.19 |
DAY 16. [JAVA] 변수의 형변환(Casting) 종류와 정의 (0) | 2021.09.01 |