1. 컬렉션 팩토리란?
자바 9에서 지원하는 작은 컬렉션 객체를 쉽게 만들 수 있는 몇 가지 방법이 있다
그중 대표적인 3가지 List, Set, Map의 컬렉션 팩토리의 객체 생성 과정과 특징을 알아보자
1) 리스트 팩토리
List<String> friends = List.of("Raphel", "Olivia", Thibaut");
기존의 방법과 마찬가지로 추가나 삭제를 하려고 하면 java.lang.UnsupportedOperationExcepion이 발생한다
-> 이러한 제약은 컬렉션이 의도치 않게 변하는 것을 방지해 준다.
-> 데이터 처리 형식을 설정하거나 데이터의 변환 과정이 필요 없다면 스트림 API 보다 팩토리 메서드를 권장한다.
(스트림 API에서는 Collectors.toList() 컬렉터로 리스트로 변환 가능)
2) 집합 팩토리
Set<String> friedns = Set.of("Raphel", "Olivia", "Thibaut");
앞서 리스트 팩토리와 비슷하지만 중복된 요소 값을 넣을 수 없다.
만약 넣으려고 한다면 IllegalArgumentException 발생한다.
3) 맵 팩토리
Map<String, Integer> ageOfFriends
= Map.of("Raphel", 30, "Olivia", 25, "Thibaut", 26);
다른 팩토리 메서드와 생성 방법은 동일하지만 키와 값을 번갈아 제공하는 방법으로 생성한다.
만약 10개 이상의 더 많은 요소를 넣어야 한다면 가변 인수로 구현된 Map.ofEntries 팩토리 메서드 사용 권장한다.
2. 리스트와 집합 처리
스트림 동작은 새로운 결과(리스트)를 반환한다. 하지만 이러한 방법은 동작에 에러를 유발할 수 있고 복잡하다
그래서 자바는 기존 컬렉션을 바꿔서 간단하게 코드를 구현할 수 있게 하는 몇 가지 메서드를 제공한다.
(기본적으로 람다 표현식을 사용한다)
1) removeIf
-> 프레디케이트를 만족하는 요소를 제거한다.
-> List, Set을 구현하거나 구현을 상속받은 모든 클래스에서 이용 가능
2) replaceAll
-> 리스트에서 각 요소를 새로운 요소로 바꿀 수 있다
3. 맵 처리
Map을 처리하기 위해서는 키와 값을 모두 고려해야 하기 때문에 List와 Set에 비해서 복잡하게 느껴지는데
자바에서 지원하는 여러 메서드들을 통해 비교적 쉽게 처리가 가능하다. 이와 관련된 메서드들을 간단히 정리해 보았다.
1) forEach
-> 자바 8부터 키와 값을 인수로 받는 forEach 메서드를 지원하기 때문에 람다 표현식으로 간단히 구현이 가능하다.
2.1) Entry.comparingByValue
2.2) Entry.comparingByKey
-> 맵의 항목을 키 또는 값을 기준으로 정렬할 수 있다.
ex) 사람의 이름의 알파벳 순으로 정렬 가능
3) getOrDefault
-> 맵에서 키가 존재하지 않으면 기본값을 반환
이 외에도 맵의 키 값 존재 여부에 따라 동작하는 계산 패턴, 키에 해당하는 특정 항목을 제거하기 위한 삭제 패턴,
맵의 항목을 교환할 때 사용되는 교체 패턴 등 다양한 Map 인터페이스의 기능을 통해 다양한 동작을 수행할 수 있다.
Reference
참고 도서명: 모던 자바 인 액션
'book > modern java in action' 카테고리의 다른 글
Chapter 10 람다를 이용한 도메인 언어(DSL, domain-specific languages) (0) | 2023.01.27 |
---|---|
Chapter 9 리팩터링, 테스팅, 디버깅 (전략 디자인 패턴의 리팩터링) (0) | 2023.01.23 |
Chapter 6 스트림으로 데이터 수집(Collect, Collector, Collectors) (0) | 2023.01.07 |
Chapter 5 스트림 활용 (0) | 2022.12.30 |
Chapter 4 스트림 소개 (0) | 2022.12.24 |
댓글