-
람다식(3) - 최종처리언어/JAVA 2023. 7. 14. 17:54
1. 요소 조건 만족 여부(매칭)
- 매핑은 스트림의 요소들이 특정 조건에 만족하는지 여부를 조사하는 최종 처리 기능이다.
- 매개값으로 주어진 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 스트림이 제공하는 기본 집계
- 집계 메소드가 리턴하는 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. 커스텀 집계
- 기본 집계 메서드외에 다양한 집계 결과물을 만들 수 있도록 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>)커스텁 집계 값 '언어 > JAVA' 카테고리의 다른 글
nextStep - 모든 원시값과 문자열 포장 (0) 2023.07.23 nextstep-자동차경주 (테스트하기 어려운 코드 테스트하기) (0) 2023.07.23 스트림(2) - 중간 처리 (0) 2023.07.14 스트림(1) - 스트림이란,리소스로 스트림 얻기 (0) 2023.07.14 - JavaNextStep - 숫자야구게임(1) - 단위테스트 (0) 2023.07.10