본문 바로가기

JAVA

스트림12 스트림의 그룹화 분할

스트림의 그룹화 분활

Collectors partitioningBy()는 스트림을 2분활 한다.

Collector partitioningBy(Predicate predicate)

Collector partitioningBy(Predicate predicate , Collector downStream)

 

groupingBy() 는 스트립을 n분할 한다.

Collector groupingBy (Function classifier)

Collector groupingBy (Function classifier , Collector downStream)

Collector groupingBy (Function classifier , Supplier mapFactory , Collector downStream)

 

PartitionBy 는 2분할

GroupingBy는 n분할

 

partitioningBy

Map<Boolean , List<student>> stuBySex = strStream.collect(partitioningBy(student::isMale)); //성별로 분할

List<Student> maleStudent = stuBySex.get(true); //map 에서 true인값 남학생을 찾는다.

List<Student> femaleStudent = stuBySex.get(false); //map 에서 false인값 여학생을 찾는다.

 

map에 기준값(isMale)으로 true , false의 key값을 가진 map을 만든다.

 

Map<Boolean , Long> stuNumBySex = stuStream.collect(partitioningBy(student::isMale , counting())) //분할 + 통계

 

Map<Boolean , Optional<student>> topScoreBySex = stuStream

.collect(partitioningBy(student::isMale, maxBy(comparingInt(student::getScore)))) //성적 최대값 구하기

 

Map<Boolean , Map<Boolean , List<student>>> failedStuBySex = stuStream

.collect(partitioningBy(student::isMale , partitioningBy(s -> s.getScore() < 150))) //2중 분할 , 성별로 분할 후 성적으로 분할

failedStuBySex.get(true).get(true);

 

groupingBy() n분할

Map<Integer, List<student>> stuByBan = stuStream

.collect(groupingBy(student::getBan , toList())) //toList 생략가능

 

Map<Integer , Map<Integer, List<student>>> stuByHakAndBan = stuStream

.collect(groupingBy(student :: getHak ,gropingBy(student::getBan)))

 

//optional은 optional.get()으로 값을 꺼내야 한다.