스트림의 최종연산

sion Jeong·2024년 7월 16일
0

스트림의 최종연산

  • 최종연산은 스트림의 요소를 소모해 결과를 만들어낸다 → 최종연산을 하면 스트림이 닫힌다. 한번밖에 사용 못한다.
  • 중간연산 → Stream 을 반환하기에 여러번 사용이 가능함
  • 최종연산 → Stream 을 반환하지 않음 (int, void 등등) → 한번만 사용가능

지정된 작업을 수행: forEach(지정된 작업) , forEachOrderd(지정된 작업)

  • 스트림의 모든 요소에 지정된 작업을 수행함

💡 실습
중간연산

  • range(1, 10) ,(범위)(1~10까지, 10은포함 X)
  • sequential() (직렬스트림, 스트림의 작업을 직렬로 처리) → 123456789
  • parallel() (병렬스트림, 스트림 작업을 병렬로 처리) → 683295714 (순서보장 X)

forEach() , forEachOrderd() 의 차이

  • forEachOrderd() → 얘는 순서 보장이 된다
    • 따라서 병렬스트림임에도 순서가 보장됨 (병렬인데 순서보장? → 성능은 조금 떨어질수도)
public static void main(String[] args) {

        String[] strArr = { //문자열 배열
                "Inheritance", "Java", "Lambda", "stream", "OptionalDouble", "intStream", "count", "sum"
        };
      
        Stream.of(strArr)
                .forEach(System.out::println); //순서가 보장됨(직렬처리)

        Stream.of(strArr)
                .forEachOrdered(System.out::println);//병렬처리(순서가 보장되지 않음)

조건검사: allMatch(), anyMatch(), noneMAtch()

  • allMatch(조건식) → 모든 요소가 조건을 만족하면 true
  • anyMatch(조건식) → 한 요소라도 조건을 만족하면 true
  • noneMAtch() → 모든 요소가 조건을 만족시키지 않으면 true

💡 실습

  • stuStream학생들 스트림(배열, 컬렉션)에 → 총점이 100점 이하인 사람이 있는지확인
  • anyMatch(조건식) 이기때문에 한명이라도 있으면 true
public static void main(String[] args) {

        String[] strArr = { //문자열 배열
                "Inheritance", "Java", "Lambda", "stream", "OptionalDouble", "intStream", "count", "sum"
        };
   
   
boolean noEmptyStr = Stream.of(strArr).noneMatch(s -> s.length() == 0);

        System.out.println("noEmptyStr: " + noEmptyStr); //noEmptyStr: true

 

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

  • 결과가 null 일도 있기에 → Optional로 반환
  • findFirst() → 순차, 직렬스트림에 사용하기에 조건에 맞는요소를 발견하면 반환하면됨(첫번째요소)
  • findAny() → 병렬스트림에 사용되기에 조건에 맞는 요소를 순차적으로 찾을수 없음 → 조건 맞으면 바로 아무거나 바로 반환

💡 실습

  • filter(조건) 과 함께 사용한다. (총합이 100점이하인 요소)
  • findFirst() → 조건을 만족하는 첫번째 요소를 반환
  • findAny() -> 조건을 만족하는 아무거나 바로 반환한다.
public static void main(String[] args) {

        String[] strArr = { //문자열 배열
                "Inheritance", "Java", "Lambda", "stream", "OptionalDouble", "intStream", "count", "sum"
        };
      
     
        Optional<String> sWord = Stream.of(strArr)
                .filter(s ->s.charAt(0) == 's').findFirst();

        System.out.println("sWord: " + sWord.get());
    }   

스트림 요소를 하나씩 줄여가며 누적연산을 수행: reduce()

  • 스트림 최종 연산 중 가장 중요하다
  • identity 초기값, accumulator 수행할 연산 → 이 2가지가 가장 중요하다.
  • reduce(초기값, 수행할 연산)
  • 첫번째 reduce() 최종연산에선 초기값이 없음으로 결과가 → null이 나올수도 있어서 Optional로 반환했다.

💡 실습

  • count → 요소를 하나 꺼낼때마다 1씩 증가
        String[] strArr = { //문자열 배열
                "Inheritance", "Java", "Lambda", "stream", "OptionalDouble", "intStream", "count", "sum"
        };
       
       
//Stream<String>을 -> IntStream으로 변환 (IntStream)은 기본형 스트림 
//intStream1, intStream2  등등은 기본형 스트림 이기 때문에 계산가능
IntStream intStream1 = Stream.of(strArr).mapToInt(String::length);
IntStream intStream2 = Stream.of(strArr).mapToInt(String::length);
IntStream intStream3 = Stream.of(strArr).mapToInt(String::length);
IntStream intStream4 = Stream.of(strArr).mapToInt(String::length);

        int count = intStream1.reduce(0, (a, b) -> a + 1);
        int sum = intStream2.reduce(0, (a, b) -> a + b);
profile
개발응애입니다.

0개의 댓글