두개의 List를 비교하여 데이터를 처리할 로직이 있어 사용해보았다. 그 김에 정리정리를 해본다.
Stream을 사용하는 경우, 최종 연상으로 collect()를 사용하는 경우, Stream의 요소들을 수집하여 특정한 자료 구조로 변환할 수 있다. 이때 Map으로 변환하기 위해 Collectors.toMap을 사용한다.
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction) {
// ...
}
문제
dates 리스트와 brandValues를 비교하여, 일치하는 날짜의 경우 brandValues의 판매량값을 가져오고, 일치하지 않는 날짜는 0으로 세팅해야한다.


먼저 collectors.toMap을 사용하였다.
Map<Integer,Integer> dateMap = brandValues.stream()
.collect(Collectors.toMap(
DailySalesQyDto::getYyyymmdd,
DailySalesQyDto::getSalesQy,
(existing,replacement) -> replacement
));
위 코드의 결과는 아래 이미지와 같다. <날짜,판매량> 형태의 map으로 만들었다.

그리고 getOrDefault()를 사용하였다.
finalValues = dates.stream()
.map(date -> dateMap.getOrDefault(date,0))
.collect(Collectors.toList());
해당 두 로직의 결과로 아래 이미지와 같은 결과를 얻을 수 있었다.

마치며
로직을 깔끔하게 짜고 싶어서 사용해보았는데, 더 짧고 효율적인 코드가 있다면 언제나 댓글로 알려주시길..!