-
collect()와 CollectorsJAVA/스트림 2023. 8. 9. 00:33
두 가지 최종연산의 차이 - reduce()와 collect()
reduce() : 전체에 대한 리듀싱
collect() : 그룹별로 나눠서 리듀싱
collect() : Collector를 매개변수로 하는 스트림의 최종연산
Collector : 인터페이스
Colltectors : 구현체
Collector라는 인터페이스에 Collectors라는 클래스가 기능을 구현해서 그 기능들을 가져다가 사용하면 된다.
스트림을 컬렉션으로 변환 - toList(), toSet(), toMap(), toCollection()
List<String> names = stuStream.map(Student::getName) .collect(Collectors.toList()); ArrayList<String> list = names.stream() .collect(Collectors.toCollection(ArrayList::new)); // 새로운 ArrayList 만들어서 거기에 담는다. Map<String, Person> map = personStream .collect(Collectors.toMap(p -> p.getRegId(), p -> p)); // key , value
맨 위의 예제를 보면 toList를 통해 Stream<String>을 List<String>으로 변환해주었다.
나머지도 같은 방식으로 변환이 된다.
toMap에는 key와 value가 들어가야 하기 때문에 인자값으로 2개를 넣어줘야 한다.
스트림을 배열로 변환 - toArray()
Student[] stuNames = studentStream.toArray(Student[]::new); // 가능 (파라미터에 (i) -> new Student[i]도 가능) Student[] stuNames = studentStream.toArray(); // 에러 Object[] stuNames = studentStream.toArray(); // 가능
배열로 변환하려면 매개변수에 원하는 배열 타입을 넣어줘야한다. 그 타입이 반환 타입이랑 일치해야 한다.
만약에 매개변수를 넣지 않는다면 반환 타입을 Object[]로 받아야 하지만 다시 형변환을 해야하기 때문에 맨 윗 줄을 가장 많이 사용한다고 한다.
스트림의 통계정보 제공 - counting(), maxBy(), minBy()
long count = stuStream.count(); // 전체 카운트만 가능 long count = stuStream.collect(counting()); // 그룹별로 카운트가 가능
OptinalInt topScore = studentStream.mapToInt(Student::getScore).max(); // 전체의 max 값만 가능 Optional<Student> topStudent = stuStream .collect(maxBy(Comparator.comparingInt(Student::getScore))); // 그룹에서의 max 값도 가능
스트림을 리듀싱 - reducing()
IntStream intStream = new Random().ints(1, 46).distinct().limit(6); OptionalInt max = intStream.reduce(Integer::max); // 전체 리듀싱 Optional<Integer> max = intStream.boxed().collect(reducing(Integer::max)); // 그룹별 리듀싱 가능
리듀싱은 원래 있긴 하지만 collect의 reducing을 이용한다면 전체가 아니라 그룹별로 리듀싱도 가능하다.
'JAVA > 스트림' 카테고리의 다른 글
스트림의 그룹화와 분할 (0) 2023.08.09 Optinal (0) 2023.08.09 스트림의 연산 - 최종 연산 (0) 2023.08.08 스트림의 연산 - 중간 연산 (0) 2023.08.08 스트림 만들기 (0) 2023.08.08