[JAVA] Collectors.toMap() ,getOrDefault 사용기

yeonjoo913·2023년 10월 29일

JAVA

목록 보기
14/19

두개의 List를 비교하여 데이터를 처리할 로직이 있어 사용해보았다. 그 김에 정리정리를 해본다.

Collectors.toMap은 ?

Stream을 사용하는 경우, 최종 연상으로 collect()를 사용하는 경우, Stream의 요소들을 수집하여 특정한 자료 구조로 변환할 수 있다. 이때 Map으로 변환하기 위해 Collectors.toMap을 사용한다.

  • toMap()시 key의 중복 해결
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) {
// ...
}
  • mergeFunction이란?
    mergeFunction은 동일한 키로 인해 충돌이 발생했을 때, 어떠한 value를 취할 것인지 결정할 때 사용된다. 무조건 새로운 값으로 덮어쓰는 경우 다음과 같이 쓸 수 있다.
    (existingValue, newValue) -> newValue;

getOrDefault(key,defaultValue)

  • 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드이다.

사용기

문제
dates 리스트와 brandValues를 비교하여, 일치하는 날짜의 경우 brandValues의 판매량값을 가져오고, 일치하지 않는 날짜는 0으로 세팅해야한다.

  1. List dates는 기간에 대한 정보를 가지고 있다.
  2. List brandValues 는 일자별 브랜드의 판매량을 가지고 있다.

먼저 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());

해당 두 로직의 결과로 아래 이미지와 같은 결과를 얻을 수 있었다.


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

profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글