Map 인터페이스에서 Java 8 버전에 추가된 일부 API에 대해 살펴봅니다.
- putIfAbsent()
- compute()
- computeIfPresent()
- computeIfAbsent()
- getOrDefault()
해당 코드는 Map 인터페이스의 구현체인 HashMap을 기준으로 정리하였습니다.
1. putIfAbsent(K key, V value)
Map - putIfAbsent()
putIfAbsent() 메서드는 네이밍에서 유추할 수 있듯이, 다음과 같이 동작합니다.
- Key가 존재할 경우: Value 변경 없이 기존에 존재하는 Key의 Value를 리턴합니다.
- Key가 존재하지 않는 경우: Key에 해당하는 Value를 저장한 후 null을 리턴합니다.
HashMap - putIfAbsent()
Map의 구현체인 HashMap을 보면 putVal() 메서드를 통해 진행되고, Key가 존재하면 oldValue를 그렇지 않으면 null을 리턴합니다.
- map에 key=20, value=5 인 데이터를 put 합니다.
- map.putIfAbsent(20, 10): Key가 존재하기 때문에 Value의 수정 없이 5를 리턴합니다.
- map.putIfAbsent(10, 5): Key가 존재하지 않기 때문에 5를 저장한 후 null을 리턴합니다.
2. compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
compute() 메서드는 다음과 같이 동작합니다.
- Key의 여부와 상관없이 전달받은 인자를 통하여 람다 함수를 적용하고, 결과에 따라 key를 제거하거나 새로운 value를 저장
- Key가 존재하지 않을 경우 NullPointerException이 발생할 수 있습니다.
위 8번째 라인에서 존재하지 않는 Key에 대해서는 NullPointerException 예외가 발생하는데요, 이는 람다 함수에서 두 번째 value가 null로 전달이 되고, null인 상태에서 intValue() 메서드를 호출하려고 하기에 NPE 에러가 발생합니다.
따라서 위의 경우 function의 연산을 하기 전 value의 값을 체크하여 설정하면 예외가 발생하지 않습니다.
3. computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction
computeIfAbsent() 메서드는 다음과 같이 동작합니다.
- Key가 존재할 경우: 아무런 작업을 하지 않고 기존에 존재하는 Key의 Value를 리턴
- Key가 존재하지 않는 경우: 람다식을 적용한 값을 해당 key에 저장한 후 newValue를 반환
computeIfAbsent() 메서드는 위에서 살펴본 putIfAbsent() 메서드와 비슷하게 동작을 합니다.
Key가 존재하면 기존에 존재하는 Value를 리턴하고, Key가 존재하지 않으면 새로운 값을 저장한 후 null을 반환(putIfAbsent) 하거나 새로운 값(newValue, computeIfAbsent()을 리턴한다는 차이점만 존재합니다.
4. computeIfPresent(K key, Function<? super K, ? extends V> mappingFunction
computeIfPresent() 메서드는 다음과 같이 동작합니다.
- Key가 존재할 경우: 람다식을 적용한 값이 null이 아니면 해당 key에 저장한 후 반환, null이면 key 제거 후 null 반환
- Key가 존재하지 않는 경우: null 반환
computeIfPresent() 예제
위 코드는 key의 value가 1이면 key를 제거하고, 1이 아닌 경우(1보다 큰 경우) -1을 하는 간단한 로직입니다.
after 코드에서는 value가 1일 경우 람다식 결과값을 null로 설정하고, 1이 아닌 경우 기존 value - 1을 합니다.
(위 computeIfPresent() 메서드에서 람다식 결과값이 null이면 key를 제거한 후 null을 반환하기 때문입니다.)
5. getOrDefault(Object key, V defaultValue)
getOrDefault() 메서드는 다음과 같이 동작합니다.
- key가 존재할 경우: key에 존재하는 value를 반환합니다.
- Key가 존재하지 않는 경우: 두 번째 인자로 설정한 defaultValue를 반환합니다.
getOrDefault() 메서드를 사용하면 코드가 간결해지고 가독성이 높아지기 때문에 개인적으로 자주 사용하는 메서드 중 하나입니다.
getOrDefault() 메서드를 사용하지 않는다면 before 코드처럼 매번 Map에 key가 존재하는지 여부를 확인해야 합니다.
하지만 getOrDefault() 메서드는 key가 존재하지 않는 경우 defaultValue를 지정할 수 있기 때문에 굉장히 편리하게 사용할 수 있습니다.
Reference:
'Language > Java' 카테고리의 다른 글
[Java] CompletableFuture에 대한 이해 및 사용법 (0) | 2024.04.21 |
---|---|
[Java] 이보다 잘 정리한 가이드가 있을까? JUnit5 완벽 가이드 (0) | 2024.04.18 |
[Java] 윈도우에 OpenJDK 17 설치 (0) | 2024.04.06 |
[Java] Apple Silicon mac openjdk 17 설치 (0) | 2024.04.02 |