Collections
Map: computeIfAbsent で既定値を登録する
キーがない場合にだけ、計算した値を登録して返します。
SourceVisitCounts.java
Java 21
package examples.map;
import java.util.Map;
public final class VisitCounts {
private VisitCounts() {}
public static int countFor(Map<String, Integer> counts, String page) {
return counts.computeIfAbsent(page, ignored -> 0);
}
}TestVisitCountsTest.java
Java 21
package examples.map;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.HashMap;
import org.junit.jupiter.api.Test;
class VisitCountsTest {
@Test
void 存在しないキーには既定値が登録される() {
var counts = new HashMap<String, Integer>();
assertEquals(0, VisitCounts.countFor(counts, "/java/list/add"));
assertEquals(0, counts.get("/java/list/add"));
}
@Test
void 既にあるキーの値は置き換えない() {
var counts = new HashMap<String, Integer>();
counts.put("/java/string/equals", 3);
assertEquals(3, VisitCounts.countFor(counts, "/java/string/equals"));
}
}01Assertion
このテストで確認できること
- 存在しないキーには既定値が登録される
- 既にあるキーの値は置き換えない
getOrDefault は読み取りだけです。Map へ既定値も保存したい場合は computeIfAbsent を使います。
OBSERVED RESULT
expected: visits.get("java") → 0
actual: 0