가령 아래와 같은 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의 세계는 참으로 쿨록쿨록..