https://www.youtube.com/watch?v=VUh_t_j9qjE&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=171
본 강의는 위 강의를 듣고 정리를 진행했습니다.
- partitioningBy()는 스트림을 2분할 한다.
- groupingBy()는 스트림을 n분할 한다.
Collector partitioingBy(Predicate predicate)
Map<Boolean, List<Student>> stuBySex = stuStream.collect(paritioingBy(Student::isMale));
List<Student> maleStudent = stuBySex.get(true);
List<Student> femaleStudent = stuBySex.get(false);
Map<Boolean, Long> stuNumBySex = stuStream.collect(partitioningBy(Student::isMale, counting()));
Long maleCount = stuBySex.get(true);
List femaleCount = femaleStudent = stuBySex.get(false);
// 분할 + 통계
Map<Boolean, Optional<Student>> topScoreBySex = stuStream.collect(partitioningBy(Student::isMale, maxBy(comparingInt(Student::getScore));
// 남학생 1등, 여학생 1등 출력
topScoreBySex.get(true), topScoreBySex.get(false);
// 다중 분할
Map<Boolean, Map<Boolean, List<Student>>> failedStuBySex = stuStream // 다중 분할
.collect(partitioningBy(Student::isMale, paritioningBy(s -> s.getScore() < 150))); // 성별, 성적 분할
List<Student> failedMaleStu = failedStuBySex.get(true).get(true);
- 스트림의 그룹화 - groupingBy()
- 스트림의 요소를 그룹화
Collector groupingBy(Function classifier)
Map<Integer, List<Student>> stuByBan = stuStream.collect(groupingBy(Student::getBan, toList()));
// 학생 반별 그룹화 toList 생략 가능
// 다중 그룹화 1. 학년 그룹화 2. 반별 그룹화
Map<Integer, Map<Integer, List<Student>>> stuByHakAndBan = stuStream.collect(
groupingBy(Student::getHak, groupingBy(Student::getBan)));
Map<Integer, Map<Integer, Set<Student.Level>>> stuByHakAndBan = stuStream
.collect(
groupingBy(Student::getHak, groupingBy(Student::getBan,
mapping(s -> { // 성적 등급으로 변환(level)
if (s.getScore() >= 200) return Student.Level.HIGH;
else if(s.getScore() >= 100) return Student.Level.MID;
else return Student.Level.LOW;
}, toSet()) // mapping // enum Level {HIGH, MID, LOV}}
)) // GROUPING BY
}; // collect()
'📗 BOOK > 자바의 정석 - 기초편' 카테고리의 다른 글
선언위치 변수종류(클래스 변수/인스턴스 변수) (0) | 2024.01.04 |
---|