❐ Description
[로또]3주차 과제를 하면서 Map의 여러 메소드 중 computeXxx 메소드를 사용하게 됐다.
오늘은 해당 메소드가 어떤 역할을 하면 관련된 메소드에는 무엇이 있는지 학습할 것이다.
❐ Map의 computeXxx 메소드
위 그림과 같이 총 3개의 메소드가 있고, 모드 메서드 파라미터로 Java Functional Interface를 받는다.
1. computeIfAbsent(...)
@Test
@DisplayName("computeIfAbsent")
void testComputeIfAbsent() {
EnumMap<RankCondition, Integer> enumMap = new EnumMap<>(RankCondition.class);
RankCondition.valuesExceptNone()
.forEach(rank -> enumMap.put(rank, 0));
enumMap.computeIfAbsent(RankCondition.FIRST, key -> 10);
enumMap.computeIfAbsent(RankCondition.NONE, key -> 10);
System.out.println(enumMap.get(RankCondition.FIRST)); // 0
System.out.println(enumMap.get(RankCondition.NONE)); // 10
}
지정된 키가 값에 이미 정의되어 있지 않거나 null로 매핑되어 있는 경우, 지정된 매핑 함수를 사용하여
값을 계산하고 null이 아닌 경우 이 맵에 입력한다. 가장 일반적인 사용법은 초기 매핑된 값 또는 메모화된
결과로 사용되는 새 객체를 구성하는 것이다.
2. computeIfPresent(...)
@Test
@DisplayName("computeIfPresent")
void testComputeIfPresent() {
EnumMap<RankCondition, Integer> enumMap = new EnumMap<>(RankCondition.class);
RankCondition.valuesExceptNone()
.forEach(rank -> enumMap.put(rank, 0));
enumMap.computeIfPresent(RankCondition.FIRST, (key, value) -> value + 10);
enumMap.computeIfPresent(RankCondition.NONE, (key, value) -> value + 10);
System.out.println(enumMap.get(RankCondition.FIRST)); // 10
System.out.println(enumMap.get(RankCondition.NONE)); // null
}
지정된 키의 값이 존재하고 null이 아닌 경우, 키와 현재 매핑된 값이 주어지면 새 매핑을 계산하려고 시도한다.
리매핑 함수가 null을 반환하면 매핑이 제거된다. 리매핑 함수 자체에서 예외가 발생하면 예외가 다시 발생하고
현재 매핑은 변경되지 않은 상태로 유지된다.
3. compute(...)
@Test
@DisplayName("compute")
void testCompute() {
EnumMap<RankCondition, Integer> enumMap = new EnumMap<>(RankCondition.class);
RankCondition.valuesExceptNone()
.forEach(rank -> enumMap.put(rank, 0));
enumMap.compute(RankCondition.FIRST, (key, value) -> value + 10);
enumMap.compute(RankCondition.NONE, (key, value) -> value + 10);
System.out.println(enumMap.get(RankCondition.FIRST)); // 10
System.out.println(enumMap.get(RankCondition.NONE)); // NPE
}
지정된 키와 현재 매핑된 값(또는 현재 매핑이 없는 경우 null)에 대한 매핑을 계산하려고 시도한다.
리매핑 함수가 null을 반환하면 매핑이 제거된다.(또는 처음에 없는 경우 부재 상태로 유지됨). 리매핑 함수 자체에서
(확인되지 않은) 예외가 발생하면 예외가 다시 발생하고 현재 매핑은 변경되지 않은 상태로 유지된다.
해당 메소드를 사용할 때 주의할 점이 있는데,
위의 이미지 처럼 Unboxing of 'value' may produce 'NullPointerException' 경고가 발생하게 된다.
이 이유는 현재 정의된 enumMap에 해당 키가 존재하지 않을 수도 있기 때문이다.
'우테코 7기 > 3주차' 카테고리의 다른 글
과제를 하면서 알게된 사소한 지식들 (0) | 2024.11.04 |
---|---|
정적 팩토리 메소드 왜 쓰는걸까? (0) | 2024.11.04 |
EnumMap을 쓰는 이유 (0) | 2024.11.03 |
3주차 회고 (0) | 2024.11.03 |
로또 (0) | 2024.11.03 |