본문 바로가기

Programming/Java

DAY 100. JAVA - 스트림(Stream) 중간 처리 메소드 종류

 

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) 숫자 범위로 스트림 얻기
 : IntStreamrange(), 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()과 같은 다른 최종 처리 메소드를 호출할 수 없다.