본문 바로가기

Programming!

Stream 에서 특정 필드들에 대한 Key Count GroupingBy

가령 아래와 같은 Dto가 List로 있다고 하자.

public class ProductDto {


String groupSkuCode;



String skuCode;

}


List<ProductDto> productDtos = ...





요구사항은 groupSkuCode를 기반으로 skuCode가 여러개를 가질 수 있는 경우, groupSkuCode를 키로 가지며 skuCode에 대해서 Group Count를 볼 수 있는 Map을 반환 하고 싶을 경우이다.

(아... 어렵군)


그럼  collect에 대해서 다음과 같이 하면 key는 처리될 터이고.

productDtos.stream().collect(Collectors.groupingBy(ProductDto::getGroupSkuCode, {그럼 여기가 문제겠지}...


단순히 해당 getGroupSkuCode 에 대한 size를 가지는 경우라면 쉽게 가능한데.. 이건 그게 아니라 별도 컬럼 즉, skuCode에 대한 group count 여서 문제..


결과적으로 아래와 같이 좀 여러번 래핑처리 하면 구할 수 있다.


Collectors.collectingAndThen(Collectors.mapping(ProductDto::getSkuCode, Collectors.toSet()),Set::size) 



해서 전체 코드를 보면, 

Map<String, Integer> ..map.. = productDtos.stream().collect(

  Collectors.groupingBy(ProductDto::getGroupSkuCode,

    Collectors.collectingAndThen(

      Collectors.mapping(ProductDto::getSkuCode, Collectors.toSet()), Set::size)));


stream의 세계는 참으로 쿨록쿨록..