Java - collect() & Collectors

iseon_u·2022년 6월 18일
0

Java

목록 보기
75/77
post-thumbnail

collect() & Collectors


collect() 스트림 최종 연산

Object collect(Collector collector) 
// Collector 를 구현한 클래스의 객체를 매개변수로
  • collect() 는 Collector 를 매개변수로 하는 스트림의 최종 연산
  • 최종 연산
    • collect() : 그룹별 리듀싱
    • reduce() : 전체 리듀싱

Collector 인터페이스

public interface Collector<T, A, R> {}
// T (요소) 를 A 에 누적한 다음, 결과를 R 로 변환해서 반환
  • 수집 (collect) 에 필요한 메서드를 정의해 놓은 인터페이스
  • 직접 구현하는 일이 거의 없다 (Collectors 클래스 사용)

Collectors 클래스

  • 다양한 기능의 컬렉터(Collector 를 구현한 클래스) 를 제공
  • 변환
    • mapping() toList() toSet() toMap() toCollection()
  • 통계
    • counting() summingInt() averagingInt() maxBy() minBy() summarizingInt()
  • 문자열 결합
    • joining()
  • 리듀싱
    • reducing()
  • 그룹화와 분할
    • groupingBy() partitioningBy() collectingAndThen()

스트림을 컬렉션, 배열로 변환

스트림을 컬렉션으로 변환

  • toList() toSet() toMap() toCollection()
List<String> names = stuStream.map(Student::getName)
														.collect(Collectors.toList());
// Stream<String> -> List<String>
// .collect(Collectors.toList()

스트림을 배열로 변환

  • toArray()
Student[] stuNames = studentStream.toArray(Student[]::new); // ✅ OK
Student[] stuNames = studentStream.toArray(); // ❌ 에러
Object[] stuNames = studentStream.toArray(); // ✅ OK

스트림의 통계

스트림의 통계 정보 제공

  • counting() summingInt() maxBy() minBy()
long count = stuStream.count();
// 전체 count()
long count = stuStream.collect(counting()); // Collectors.counting()
// 그룹별 counting() 가능
long totalScore = stuStream.mapToInt(Student::getTotalScore).sum();
// IntStream 의 전체 sum()
long totalScore = stuStream.collect(summingInt(Student::getTotalScore));
// 그룹별 summingInt() 가능

스트림을 리듀싱

reducing()

Collector reducing(T identity, BinaryOperator<T> op)
  • reducing()
    • 그룹별 리듀싱
  • reduce()
    • 전체 리듀싱

joining()

String studentNames = stuStream.map(Student::getName).collect(joining());
String studentNames = stuStream.map(Student::getName).collect(joining(","));
// 구분자
  • joining()
    • 문자열 스트림의 요소를 모두 연결

스트림의 그룹화와 분할

Map<Boolean, List<Student>> stuBySex = stuStream
											.collect(partitioningBy(Student::isMale));
// 학생들을 성별로 분할
  • partitioningBy()
    • 스트림을 2분할한다.
Map<Integer, List<Student>> stuByBan = stuStream
								.collect(groupingBy (Student::getBan, toList()));
// 학생 반별로 그룹화
  • groupingBy()
    • 스트림을 n분할한다.
profile
🧑🏻‍💻 Hello World!

0개의 댓글