Java - Stream terminal operation

iseon_u·2022년 6월 11일
0

Java

목록 보기
74/77
post-thumbnail

Stream terminal operation


스트림의 최종연산

  • 연산 결과가 스트림이 아닌 연산
  • 단 한번만 적용 가능
  • 스트림의 요소를 소모

스트림의 최종연산 - forEach() forEachOrdered()

void forEach(Consumer<? super T> action) 
// 병렬 스트림인 경우 순서가 보장되지 않음

void forEachOrdered(Consumer<? super T> action)
// 병렬 스트림인 경우에도 순서가 보장됨
  • forEach()
    • 병렬 스트림인 경우 순서가 보장되지 않음 ❌
  • forEachOrdered()
    • 병렬 스트림인 경우에도 순서가 보장됨 ✅
IntStream.range(1,10).sequential().forEach(System.out::print);
//123456789

IntStream.range(1,10).sequential().forEachOrdered(System.out::print);
//123456789
  • sequential() - 직렬 스트림
    • 스트림은 기본적으로 직렬 스트림
IntStream.range(1,10).parallel().forEach(System.out::print);
//683295714 // 순서 보장 ❌

IntStream.range(1,10).parallel().forEachOrdered(System.out::print);
//123456789 // 순서 보장 ✅
  • parallel() - 병렬 스트림
    • 여러 스레드로 나눠서 작업

스트림의 최종 연산 - 조건 검사

조건 검사 allMatch() anyMatch() noneMatch()

boolean allMatch (Predicate<? super T> predicate)
// 모든 요소가 조건을 만족시키면 true

boolean anyMatch (Predicate<? super T> predicate)
// 한 요소라도 조건을 만족시키면 true

boolean noneMatch (Predicate<? super T> predicate)
// 모든 요소가 조건을 만족시키지 않으면 true
boolean hasFailedStu = stuStream.anyMatch(s-> s.getTotalScore()<=100);
// 100 이하가 있는지

조건에 일치하는 요소 찾기 findFirst() findAny()

Optional<T> findFirst()
  • 첫 번째 요소를 반환
  • 순차 스트림에 사용
Optional<T> findAny()
  • 아무거나 하나를 반환
  • 병렬 스트림에 사용
Optional<Student> result = stuStream.filter(s->s.getTotalScore() <= 100).findFirst();
Optional<Student> result = parallelStream.filter(s->s.getTotalScore() <= 100).findAny();
  • filter() 와 같이 사용

스트림의 최종 연산 - reduce()

  • 스트림의 요소를 하나씩 줄여가며 누적연산 수행 - reduce()
  • identity - 초기값
  • accumulator - 이전 연산 결과와 스트림의 요소에 수행할 연산

💡 accumulate : 누적하다

// int reduce(int identity, IntBinaryOperator op)
int count = intStream.reduce(0, (a,b) -> a + 1); // count()
int sum = intStream.reduce(0, (a,b) -> a + b); // sum()
int max = intStream.reduce(Integer.MIN_VALUE, (a,b)-> a > b ? a : b); 
// max()
int min = intStream.reduce(Integer.MAX_VALUE, (a,b)-> a < b ? a : b); 
// min 

reduce() 내부 구조

int sum = intStream.reduce(0, (a,b) -> a + b)
// -----> reduce() 내부 구조

int a = identity; // 0

for(int b : stream)
		a = a + b; // sum() // accumulator
profile
🧑🏻‍💻 Hello World!

0개의 댓글