08. 컬렉션 API 개선

주요 내용
  • 컬렉션 팩토리 사용
  • 리스트 및 집합과 사용할 새로운 관용 패턴
  • 맵과 사용할 새로운 관용 패턴

컬렉션 팩토리 사용#

Java 9

  • 리스트 팩토리: List.of(...)
    • Unmodifiable Lists 를 반환
    • 리스트를 바꿔야하는 상황이라면 카피를 떠서 직접 리스트 만들기
  • 집합 팩토리: Set.of(...)
  • 맵 팩토리: 아래와 같이 두가지 방법이 있음
Map<String, Integer> map = Map.of(
"a", 10,
"b", 25);
Map<String, Integer> map = Map.ofEntries(
Map.entry("a", 10),
Map.entry("b", 25));
// 둘다 같은 {a=10, b=25} 표현

리스트 및 집합과 사용할 새로운 관용 패턴#

Java 8

Java 8 부터 List, Set에 removeIf, replaceAll, sort 를 제공함

removeIf#

transactions.removeIf(t ->
Character.isDigit(t.getReferenceCode().charAt(0)));

replaceAll#

referenceCodes.replaceAll(code ->
Character.toUpperCase(code.charAt(0)) + code.substring(1));
// [a12, C14, b13] -> [A12, C14, B13]

맵과 사용할 새로운 관용 패턴#

Java 8

forEach#

따로 Entry 선언 없이 람다 + forEach 로 순회

ageOfFriends.forEach((friend, age) ->
System.out.println(friend + " is " + age + " years old"))

정렬#

  • Entry.comparingByValue, Entry.comparingByKey 를 제공
favoriteMovies.entrySet()
.stream()
.sorted(Etnry.comparingByKey())
.forEachOrdered(System.out::println)

기본값 조회#

  • 값을 조회했는데 NPE 일 경우를 대비해 getOrDefault 를 제공
favoriteMovies.getOrDefault("Thibaut", "Null Value");
// 해당 키가 없으면 "Null Value" 스트링을 반환

계산 패턴#

  • computeIfAbsent(key, lambda): key가 존재하지 않으면 lambda 결과를 맵에 추가
  • computeIfPresent(key, lambda): key가 존재하면 lambda 결과를 맵에 교체
    • lambda 결과가 null이라면 key를 없애는데, 이런 기능은 remove가 더 적합하다
  • compute(key, lambda): key값에 대한 lambda 결과를 맵에 적용
friendsToMovies
.computeIfAbsent("Raphael", name -> new ArrayList<>())
.add("Star Wars");
// {Raphael: [Star Wars]}

삭제 패턴#

  • remove(key): 해당 키를 삭제
  • remove(key, value): 해당 key가 value 와 동일하다면 삭제

교체 패턴#

  • replace(key, value): key가 있을경우 value로 교체
  • replace(key, oldValue, newValue): oldValue가 기존 데이터와 동일할 경우 newValue로 교체
  • replaceAll(BiFunction): BiFunction 결과로 value를 교체

합침 (Merging)#

Map<String, String> every = new HashMap<>(family);
friends.forEach((k, v) ->
every.merge(k, v, (m1, m2) -> m1 + " & " + m2));
// 키가 중복되는 경우가 있으면 3번째 인수로 지정한 람다 결과를 반영
  • .merge 를 이용하면 값이 null 일때에 대한 상황도 처리해줌

추가적으로 ConcurrentHashMap 으로 동시성을 보장할 수 있는 맵을 지원함

Last updated on