ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스트림의 연산 - 최종 연산
    JAVA/스트림 2023. 8. 8. 23:21

    1. 스트림의 모든 요소에 지정된 작업을 수행 - forEach(), forEachOrdered()

     

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

     

    직렬일 경우

    IntStream.range(1, 10).sequential().forEach(System.out::print);        // 정렬 됨
    IntStream.range(1, 10).sequential().forEachOrdered(System.out::print); // 정렬 됨

    병렬일 경우

    IntStream.range(1, 10).parallel().forEach(System.out::print);        // 정렬 안됨
    IntStream.range(1, 10).parallel().forEachOrdered(System.out::print); // 정렬 됨

     

     

     

     

    2. 조건 검사 - allMatch(), anyMatch(), noneMatch()

     

    boolean allMatch(Predicate<? super T> predicate)      // 모두 만족하는지

    boolean anyMatch(Predicate<? super T> predicate)    // 하나라도 만족하는지

    boolean noneMatch(Predicate<? super T> predicate)  // 모두 만족하지 않는지

    boolean hasFailedStu = stuStream.anyMatch(s -> s.getScore() <= 100); // 불합격자가 있는지 확인
    String[] strArr = { "Java", "Hello", "Hi" };
    
    boolean noEmptyStr = Stream.of(strArr).noneMatch(s -> s.length() == 0) // true 반환

    문자의 길이가 0인것이 아무것도 없으니까 true를 반환하다.

     

     

     

     

     

    3. 조건에 일치하는 요소 찾기

     

    Optional<T> findAny() // 아무거나 하나. 병렬 스트림에 사용

    Optional<T> findFirst() // 첫 번째 요소.   순차 스트림에 사용

    Optional<Student> result = stuStream.filter(s -> s.getScore() <= 100).findFirst();
    Optional<Student> result = ParallelStream.filter(s -> s.getScore() <= 100).findAny();
    String[] strArr = { "Java", "Hello", "Hi" };
    
    Optinal<String> Hword = Stream.of(strArr)
                              .filter(s -> s.charAt(0) == "H").findFirst(); // Hello만 반환
                              
    Optinal<String> Hword = Stream.of(strArr).parallel()
                              .filter(s -> s.charAt(0) == "H").findAny();   // 랜덤 반환

    findFirst()는 순차적으로 찾기 때문에 앞에 있는 Hello를 반환하는 반면 parallel 구조일 때 findAny는 병렬로 찾기 때문에 Hello나 Hi 등 랜덤을 반환한다.

     

     

     

     

     

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

     

    Optional<T> reduce(BinaryOperator<T> accumulator)

    T                   reduce(T identity, BinaryOperator<T> accumulator)

     

    identity         - 초기값

    accumulator - 이전 연산결과와 스트림의 요소에 수행할 연산

     

    // 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()

     

    sum 하나를 예를 들어서 어떻게 동작하는지 다시 써보면

    int a = identity;
    
    for(int b : stream)
        a = a + b;   // sum()

    위와 같은 코드처럼 동작하는 것이다.

    'JAVA > 스트림' 카테고리의 다른 글

    collect()와 Collectors  (0) 2023.08.09
    Optinal  (0) 2023.08.09
    스트림의 연산 - 중간 연산  (0) 2023.08.08
    스트림 만들기  (0) 2023.08.08
    스트림  (0) 2023.08.08
Designed by Tistory.