Table of Contents
ToggleJava EnumMap compute Method
使用所提供的映射方法 BiFunction 為指定鍵計算一個新值,該鍵可能存在或不存在於 Map 中, Compute Java EnumMap 介紹常見的 compute 、 computeIfAbsent 、 computeIfPresent 等方法,本篇增加了範例,並透過單元測試來驗證產出結果。
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
}
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- map
| +- enummap
| +- EnumMapComputeTest.java
單元測試
提供該鍵存在或已存在於 Map 中的關聯計算。
Fruit
建立 Fruit enum 類別。
public enum Fruit {
GRAPE, KIWIFRUIT, LEMON,
EMPTY,
APPLE, BANANA, CHERRY
}
compute
建立一個 EnumMap ,增加三個元素,計算符合條件的新值。
@Test
public void compute() {
Integer expected = 2;
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = Fruit.GRAPE;
map.compute(key, (k, v) -> v + 1);
System.out.println(map);
assertEquals(expected, map.get(key));
}
{GRAPE=1, KIWIFRUIT=2, LEMON=3}
{GRAPE=2, KIWIFRUIT=2, LEMON=3}
computeFunction
EnumMap Compute Java 建立一個 EnumMap ,增加三個元素,計算符合條件的新值。
@Test
public void computeFunction() {
Integer expected = 2;
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = Fruit.GRAPE;
map.compute(key, (k, v) -> {
v += 1;
return v;
});
System.out.println(map);
assertEquals(expected, map.get(key));
}
{GRAPE=1, KIWIFRUIT=2, LEMON=3}
{GRAPE=2, KIWIFRUIT=2, LEMON=3}
computeNullPointerException
EnumMap Compute Java 建立一個 EnumMap ,內有三個元素,計算不存在的 Key 新值 ,會拋出 NullPointerException 例外。
@Test(expected = NullPointerException.class)
public void computeNullPointerException() {
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = null;
map.compute(key, (k, v) -> v + 1);
System.out.println(map);
}
java.lang.NullPointerException
at org.ruoxue.java_147.map.enummap.EnumMapComputeTest.lambda$2(EnumMapComputeTest.java:60)
at java.util.Map.compute(Map.java:1093)
at org.ruoxue.java_147.map.enummap.EnumMapComputeTest.computeNullPointerException(EnumMapComputeTest.java:60)
computeIfAbsent
EnumMap Compute Java 建立一個 EnumMap ,內有三個元素,計算不存在的 Key 新值。
@Test
public void computeIfAbsent() {
Integer expected = 4;
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = Fruit.APPLE;
Integer result = map.computeIfAbsent(key, k -> 4);
System.out.println(result);
System.out.println(map);
assertEquals(expected, result);
key = Fruit.GRAPE;
result = map.computeIfAbsent(key, k -> 2);
System.out.println(result);
System.out.println(map);
assertEquals(1, result.intValue());
}
{GRAPE=1, KIWIFRUIT=2, LEMON=3}
4
{GRAPE=1, KIWIFRUIT=2, LEMON=3, APPLE=4}
1
{GRAPE=1, KIWIFRUIT=2, LEMON=3, APPLE=4}
computeIfPresent
EnumMap Compute Java 建立一個 EnumMap ,內有三個元素,計算已存在的 Key 新值。
@Test
public void computeIfPresent() {
Integer expected = 2;
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = Fruit.GRAPE;
Integer result = map.computeIfPresent(key, (k, v) -> v + 1);
System.out.println(result);
System.out.println(map);
assertEquals(expected, result);
key = Fruit.APPLE;
result = map.computeIfPresent(key, (k, v) -> 4);
System.out.println(result);
System.out.println(map);
assertNull(result);
}
{GRAPE=1, KIWIFRUIT=2, LEMON=3}
2
{GRAPE=2, KIWIFRUIT=2, LEMON=3}
null
{GRAPE=2, KIWIFRUIT=2, LEMON=3}
EnumMapComputeTest.java
EnumMap Compute Example 新增單元測試,驗證是否符合預期。
package org.ruoxue.java_147.map.enummap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.EnumMap;
import java.util.Map;
import org.junit.Test;
public class EnumMapComputeTest {
public enum Fruit {
GRAPE, KIWIFRUIT, LEMON,
EMPTY,
APPLE, BANANA, CHERRY
}
@Test
public void compute() {
Integer expected = 2;
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = Fruit.GRAPE;
map.compute(key, (k, v) -> v + 1);
System.out.println(map);
assertEquals(expected, map.get(key));
}
@Test
public void computeFunction() {
Integer expected = 2;
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = Fruit.GRAPE;
map.compute(key, (k, v) -> {
v += 1;
return v;
});
System.out.println(map);
assertEquals(expected, map.get(key));
}
@Test(expected = NullPointerException.class)
public void computeNullPointerException() {
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = null;
map.compute(key, (k, v) -> v + 1);
System.out.println(map);
}
@Test
public void computeIfAbsent() {
Integer expected = 4;
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = Fruit.APPLE;
Integer result = map.computeIfAbsent(key, k -> 4);
System.out.println(result);
System.out.println(map);
assertEquals(expected, result);
key = Fruit.GRAPE;
result = map.computeIfAbsent(key, k -> 2);
System.out.println(result);
System.out.println(map);
assertEquals(1, result.intValue());
}
@Test
public void computeIfPresent() {
Integer expected = 2;
Map<Fruit, Integer> map = new EnumMap<>(Fruit.class);
map.put(Fruit.GRAPE, 1);
map.put(Fruit.KIWIFRUIT, 2);
map.put(Fruit.LEMON, 3);
System.out.println(map);
Fruit key = Fruit.GRAPE;
Integer result = map.computeIfPresent(key, (k, v) -> v + 1);
System.out.println(result);
System.out.println(map);
assertEquals(expected, result);
key = Fruit.APPLE;
result = map.computeIfPresent(key, (k, v) -> 4);
System.out.println(result);
System.out.println(map);
assertNull(result);
}
}
心得分享
Java EnumMap Compute 提供了幾種 EnumMap 常見方法的操作範例,在應用上相當廣泛,熟悉 EnumMap Compute Example 這些方法的操作,例如: compute 、 computeIfAbsent 、 computeIfPresent 等方法,可以讓程式碼更加地簡潔及容易維護。