99클럽 4일차 TIL: Collectors.toMap()

2024. 4. 7. 16:5099클럽/TIL

728x90
반응형

#1. 오늘의 학습 키워드

자바스프링에서 특정 리스트에서 구조를 분해하여 Map 구조로 만들고 싶을 때 편하게할 수 있는 방법

  • 기존에는 리스트에서 특정 요소를 뽑아서 Map 구조로 만들고 싶으면, Map 객체를 선언하여 초기화해준다음, .put() 메서드로 for 문으로 리스트의 요소를 일일이 순회하여 Map 객체안에 집어넣어줬다.
  • 이때 toMap() 메서드를 사용하면 더욱 간편히 Map 객체를 생성할 수 있다는 피드백을 받았다.
//기존 방식
Map<Integer, PersonDto> map = new HashMap<Integer, PersonDto>();

for (PersonDto dto : dtoList){
	map.put(dto.getId(), dto);
}

//새로운 방식
Map<Integer, PersonDto> map2 = dtoList.stream()
        .collect(Collectors.toMap(PersonDto::getId, dto -> dto));

#2. 공부한 내용

  • toMap
    • 발생 가능 오류:
      • 기존 put 메서드에서와는 달리 같은 key 값으로 map객체에 저장을 하려고하면 오류가 생긴다.
      • 그래서 같은 key 값을 발생시키지 않는 함수가 보장되는 상황에서만 해당 메서드를 사용하거나, mergeFunction을 사용해야한다.
    • mergeFunction
      • 같은 key 값으로 접근을 할 때, 기존 값 vs. 새로운 값 중에 어떤 값으로 저장할 지 결정할 때 사용한다.
//기존 값
(existingValue, newValue) -> existingValue;

//새로운 값
(existingValue, newValue) -> newValue;

//사용시
Map<Integer, PersonDto> map = dtoList.stream()
        .collect(Collectors.toMap(
            PersonDto::getId, 
            dto -> dto,
            (existingValue, newValue) -> newValue
        ));
  • 기본 리턴 클래스: HashMap
    • 만약 다른 Map 클래스 타입 값으로 리턴받고 싶다면, toMap() 메서드 호출 시 mapFactory 파라미터도 전달해주면 된다.
Map<Integer, PersonDto> map = dtoList.stream()
        .collect(Collectors.toMap(
            PersonDto::getId, 
            dto -> dto,
            (existingValue, newValue) -> newValue,
            LinkedHashMap::new
        ));

#3. 오늘의 회고

  • 자바스프링에서는 굉장히 다양한 클래스와 메서드들을 제공한다.
    • 구현 과정에서 반복이 많이 되는 패턴이 생기길 마련인데, 그럴 패턴이 기존에 이미 구현된 코드로 대체될 수 있는 지 알아보고, 대체가 된다면, 적용을 하여 객체지향성과 가독성을 높이는 것이 좋다.
728x90
반응형