JAVA - 람다와 스트림(8)

DevSeoRex·2022년 11월 18일
1
post-thumbnail

스트림의 최종 연산

  • 중간연산과 달리 최종 연산은 스트림의 요소를 소모해서 결과를 만들어낸다.
  • 최종 연산후에는 스트림이 닫히게 되어, 더 이상 사용할 수 없다.
  • 최종 연산의 결과는 스트림 요소의 합과 같은 단일 값 또는 스트림의 요소가 담긴 배열이나 컬렉션일 수 있다.

forEach( )

  • forEach( )는 스트림의 요소를 소모하는 최종연산이다.
// forEach() 메서드의 선언부
	void forEach(Consumer<? super T> action)

조건 검사

스트림의 요소에 대해서 조건을 검사하는 메서드는 대표적으로 세개가 있다

  • allMatch( ) : 스트림의 모든 요소가 조건식에 일치하면 true를 반환한다.
  • anyMatch( ) : 스트림의 요소 중 일부가 조건식에 일치하면 true를 반환한다.
  • noneMatch( ) : 스트림의 모든 요소가 조건식에 일치하지 않으면 true를 반환한다.
// 조건검사 메서드들의 선언부
	boolean allMatch 	(Predicate<? super T> predicate)
    boolean anyMatch	(Predicate<? super T> predicate)	
    boolean noneMatch	(Predicate<? super T> predicate)
 
// 사용 예제 : 총점이 낙제점(총점 100이하)인 학생 확인하기
boolean noFailed = stuStream.anyMatch(s -> s.getTotalScore() <= 100)

다른 종류로, 스트림의 요소 중 조건에 일치하는 첫번 째 것을 반환하는 메서드도 있다.

  • findFirst( ) : 스트림의 요소 중 조건에 일치하는 첫번 째 것을 반환한다.
  • findAny( ) : findFirst( )와 같은 반환을 하지만, 병렬 스트림의 경우에 findAny( )를 사용한다.
// findFirst() 사용 예제
Optional<Student> stu = stuStream.filter(s -> s.getTotalScore() <= 100).findFirst();

// findAny() 사용 예제
Optional<Student> stu = parallelStream.filter(s -> s.getTotalScore() <= 100).findAny();

💡 findAny( )와 findFirst( )의 반환 타입은 Optional<T> 이다

통계

  • 기본형 스트림에는 스트림의 요소들에 대한 통계 정보를 얻을 수 있는 메서드들이 있다.
  • 기본형 스트림이 아닌 경우에는 통계와 관련된 메서드가 3개뿐이다(count, max, min).
// 일반 스트림의 통계 메서드 선언
	long				count()
    Optional<T> 		max(Comparator<? super T> comparator)
    Optional<T> 		min(Comparator<? super T> comparator)

리듀싱 - reduce( )

  • 리듀싱은 스트림의 요소를 줄여나가면서 연산을 수행하고 최종 결과를 반환한다.
  • 매개변수의 타입이 BinaryOperator<T>이다.
  • 처음 두 요소를 가지고 연산한 결과를 활용하여 그 다음 요소와 연산을 진행한다.
  • 스트림의 요소를 하나씩 소모하여, 스트림의 모든 요소가 소모되면 그 결과를 반환한다.
// reduce() 메서드 선언
	Optional<T> reduce(BinaryOperator<T> accumaulator)

💡 연산결과의 초기값(identity)를 갖는 reduce( )도 있다.

// 초기값을 갖는 reduce() 메서드 선언
T reduce(T identity, BinaryOperator<T> accumulator)
U reduce(U identity, BiFunction<U,T,U> accumulator, BinaryOperator<U> combiner)
  • 위 메서드들은 초기값과 스트림의 첫 번째 요소로 연산을 시작한다.
  • 스트림의 요소가 하나도 없는 경우 초기값이 반환된다.
  • 반환 타입이 T이다

💡 최종 연산 중 count( )와 sum( ) 등은 내부적으로 모두 reduce( )를 사용하여 작성되었다.

// count , sum , max, min을 reduce( )로 작성한 예제

// count
int count = intStream.reduce(0, (a,b) -> a + 1);

// sum
int sum  = intStream.reduce(0, (a,b) -> a + b);

// max 
int max = intStream.reduce(Integer.MIN_VALUE, (a,b) -> a>b ? a:b); 

// min
int min = intStream.reduce(Integer.MAX_VALUE), (a,b) -> a<b ? a:b);

출처 : 자바의 정석 3rd Edition(남궁성 저, 도우출판)

0개의 댓글