99클럽 4일차 TIL: Collectors.toMap()
2024. 4. 7. 16:50ㆍ개발 공부
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
반응형
'개발 공부' 카테고리의 다른 글
99클럽 7일차 TIL: Collectors.toList() vs. toList() (0) | 2024.04.10 |
---|---|
99클럽 6일차 TIL: Unix Time (nanoseconds) (0) | 2024.04.09 |
99클럽 5일차 TIL: Loki (0) | 2024.04.08 |
99클럽 3일차 TIL: JPA vs. MyBatis (2) | 2024.04.06 |
99클럽 1일차 TIL: 쿼리 성능 (2) | 2024.04.04 |