ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 람다식(3) - 최종처리
    언어/JAVA 2023. 7. 14. 17:54

     

    1. 요소 조건 만족 여부(매칭)

    출처: https://velog.io/@mmy789/Java-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EA%B3%BC-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC-5

     

    - 매핑은 스트림의 요소들이 특정 조건에 만족하는지 여부를 조사하는 최종 처리 기능이다.

    - 매개값으로 주어진 Predicate가 리턴하는 값에 따라 true or false

     

    int[] intArr ={2,4,6};
    
    boolean result = Array.stream(intArr).allMatch(a -> a%2 ==0);
    result = Array.stream(intArr).anyMatch(a -> a%3==0);
    result = Array.stream(intArr).nonMatch(a -> a%3 ==0);

     

    2. 요소 기본 집계

     

    - 집계는 최종 처리 기능으로 요소들을 처리해서 카운팅,합계,평균,최대,최소값등과 같이 하나의 값으로 산출한다.

    - 대량의 데티어를 가공해서 하나의 값으로 축소하는 리덕션이라고 볼 수 있다.

     

    2.1 스트림이 제공하는 기본 집계

    출처: https://velog.io/@mmy789/Java-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EA%B3%BC-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC-5

    - 집계 메소드가 리턴하는 OptionalXXX는 -> Optional,OptionalDouble..등을 의미 

    - 이들은 최종값을 저장하는 객체로 get(),getAsDouble(),getAsInt()등을 호출하면 최종값을 얻을 수 있다.

     

    int[] arr ={1,2,3,4,5};
    
    //count
    long count = Arrays.stream(arr).filter(n->n%2==0).count();
    //sum
    long sum = Arrays.stream(arr).filter(n->n%2==0).sum();
    //avrage
    double avg = Arrays.stream(arr).filter(n->n%2==0).average().getAsdouble();
    //최대값
    int max = Arrays.stream(arr).filter(n->n%2==0).max().getAsInt();
    //최소값
    int min = Arrays.stream(arr).filter(n->n%2==0).min().getAsInt();
    int first = Arrays.stream(arr).filter(n->n%3==0).findFirst().getAsInt();

     

    2.2 Optional 클래스

     

    - Optional,OptionalDouble/Int/Long 클래스는 단순히 집계값만 저장하는 것이 아니다.

    - 집계값이 존재하지 않을 경우 디폴트 값을 설정하거나, 집계값을 처리하는 Consumer를 등록할 수 있다.

    - 컬렉션 요소는 동적으로 추가되는 경우가 많다.

    - 만약 컬렉션에 요소가 존재하지 않으면, 집계값을 산출할 수 없음으로, 예외가 발생한다.

    - Optional을 이용해 집계연산결과를 한번 감싸두면, 이를 통해 예외발생을 막을 수 있다.

     

    //집계결과를 일단 Optional에 담고, 존재하는지 검사하고, 집계값 얻기
    OptionalDouble option = stream.average();
    if(option.isPresent()){}
    
    //orElse()메서드로 집계값없을 경우 대비해서 디폴트 값 정해두기
    double avg = stream.average().orElse(0.0);
    
    //ifPresent()메소드로 집계값 있을 경우에만 동작하는 Consumer 람다식 제공하기
    stream.avrage().isPresent(a -> );

     

    3. 커스텀 집계

    출처: https://kkk-kkk.tistory.com/entry/JAVA-chapter16-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EA%B3%BC-%EB%B3%91%EB%A0%AC%EC%B2%98%EB%A6%AC-1610-%EC%BB%A4%EC%8A%A4%ED%85%80-%EC%A7%91%EA%B3%84reduce

     

    - 기본 집계 메서드외에 다양한 집계 결과물을 만들 수 있도록 reduce()메소드를 제공한다.

    - 매개값인 BinaryOperator는 두 개의 매개값을 받아 하나의 값을 return하는 람다식을 작성할 수 있다.

    - reduce는 스트림에 요소가 없을 경우 예외가 발생, indentity를 지정하면, 이 값을 디폴트 값으로 리턴

     

    List<Student> stud = Arrays.asList(new Student("xx",92), new Student("xs",10), new Student("ss",10));
    
    //방법1
    int sum1 = stud.stream().mapToInt(Student::getScore).sum();
    //방법2
    int sum2 = stud.stream().map(Student::getScore).reduce(0,(a,b)->a+b);

     

    4. 요소수집

     

    - 스트림 요소들을 필터링 혹은 매핑한 후 요소들을 수집하는 collect()를 제공

    - 위 메서드를 이용하면, 필요한 요소만 컬렉션에 담거나, 요소 그룹핑한 후에 집계도 할 수 있다.

     

    4.1 필터링한 요소 수집

    - collect(Collector<T,A,R> collector) 

    - 매개값 Collector은 어떤 요소를 어떤 컬렉션에 수집할 것인지 결정한다.

    - T는 요소, A는 누적기, R은 저장될 컬렉션 (T요소를 A누적기가 R에 저장한다.)

    - Collector의 구현 객체는 다음과 같은 Collectors 클래스의 정적메서드로 얻을 수 있다.

     

    Collector<T,?,List<T>> toList() T를 List에 저장
    Collector<T,?,Set<T>> toSet() T를 Set에 저장
    Collector<T,?,Map<K,U>> toMap(Function<T,K> kryMapper,Function<T,U> valueMapper) T를 K와 U로 매핑하여 map에 저장

     

    *누적기는 ?로 되어 있는데, Collector가 List,Set,Map 컬렉션에 요소를 저장하는 방법을 알고 있음으로, 별도의 누적기가 필요없다.

    List<Student> maleList = totalList.stream().filter(s->s.getSex().equals("남")).collect(Collectors.toList));
    
    Map<String,Integer> map = totalList.stream()
    .collect(Collectors.toMap(s->s.getName(),s->s.getScore()));

     

    4.2 요소 그룹핑 

     

    - collector()메서드는 단순히 요소 수집 기능 외에 컬렉션의 요소들을 그룹핑해서 Map객체를 생성하는 기능도 제공

    - Collectors.groupingBy()메서드에서 얻은 Collector를 collect()메서드로 호출할때 제공하면 된다.

    Collector<T,>,Map<K,List<T>>> groupingBy(Function<T,K> classifier)

    - groupingBy()는 Function을 이용해 T를 K로 매핑하고, K를 키로해서 List<T>를 값으로 갖는 map컬렉션을 생성한다.

    //"남","여"를 키로 설정하고 List<Student>를 값으로 갖는 Map 생성코드
    
    Map<String, List<Student>>map = totalList.stream().collect(Collectors.groupingBy(s->s.getSex())
    ); 
    //전체 리스트를 성별인 "남":성별남 목록, "여":성별여 목록 으로 나눈 것

     

    Collector mapping(function,Collector) 매핑
    Collector averagingDouble(ToDoubleFunction) 평균값
    Collector counting() 요소 수 
    Collector maxBy(Comparator) 최대 값
    Collector minBy(comparator) 최소 값
    Collector reducing(BinaryOperator<T>)
    reducing(T identity,BinaryOperator<T>)
    커스텁 집계 값 
Designed by Tistory.