Apache Commons Collections MapUtils
1.簡介
MapUtils是Apache Commons Collections項目中可用的工具之一。
簡而言之,它提供了實用程序方法和修飾符以與java.util.Map和java.util.SortedMap實例一起使用。
2.設定
讓我們從添加依賴關係開始:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
3.實用方法
3.1。從數組創建映射
現在,讓我們設置用於創建地圖的數組:
public class MapUtilsTest {
private String[][] color2DArray = new String[][] {
{"RED", "#FF0000"},
{"GREEN", "#00FF00"},
{"BLUE", "#0000FF"}
};
private String[] color1DArray = new String[] {
"RED", "#FF0000",
"GREEN", "#00FF00",
"BLUE", "#0000FF"
};
private Map<String, String> colorMap;
//...
}
讓我們看看如何從二維數組創建地圖:
@Test
public void whenCreateMapFrom2DArray_theMapIsCreated() {
this.colorMap = MapUtils.putAll(
new HashMap<>(), this.color2DArray);
assertThat(
this.colorMap,
is(aMapWithSize(this.color2DArray.length)));
assertThat(this.colorMap, hasEntry("RED", "#FF0000"));
assertThat(this.colorMap, hasEntry("GREEN", "#00FF00"));
assertThat(this.colorMap, hasEntry("BLUE", "#0000FF"));
}
我們也可以使用一維數組。在這種情況下,將數組視為備用索引中的鍵和值:
@Test
public void whenCreateMapFrom1DArray_theMapIsCreated() {
this.colorMap = MapUtils.putAll(
new HashMap<>(), this.color1DArray);
assertThat(
this.colorMap,
is(aMapWithSize(this.color1DArray.length / 2)));
assertThat(this.colorMap, hasEntry("RED", "#FF0000"));
assertThat(this.colorMap, hasEntry("GREEN", "#00FF00"));
assertThat(this.colorMap, hasEntry("BLUE", "#0000FF"));
}
3.2。打印Map內容
很多時候在調試時或在調試日誌中,我們要打印整個地圖:
@Test
public void whenVerbosePrintMap_thenMustPrintFormattedMap() {
MapUtils.verbosePrint(System.out, "Optional Label", this.colorMap);
}
結果:
Optional Label =
{
RED = #FF0000
BLUE = #0000FF
GREEN = #00FF00
}
我們還可以使用debugPrint()來另外打印值的數據類型。
3.3 獲得值
MapUtils提供了一些方法,可以以null安全的方式從映射中提取給定鍵的值。
例如, getString()從Map獲取一個String 。字符串值通過toString()獲得。如果該值為null或轉換失敗,我們可以選擇指定要返回的默認值:
@Test
public void whenGetKeyNotPresent_thenMustReturnDefaultValue() {
String defaultColorStr = "COLOR_NOT_FOUND";
String color = MapUtils
.getString(this.colorMap, "BLACK", defaultColorStr);
assertEquals(color, defaultColorStr);
}
請注意,這些方法是null安全的,即它們可以安全地處理null map參數:
@Test
public void whenGetOnNullMap_thenMustReturnDefaultValue() {
String defaultColorStr = "COLOR_NOT_FOUND";
String color = MapUtils.getString(null, "RED", defaultColorStr);
assertEquals(color, defaultColorStr);
}
即使映射為null,在這裡顏色也將獲得值為COLOR_NOT_FOUND 。
3.4。反轉Map
我們還可以輕鬆地反轉Map:
@Test
public void whenInvertMap_thenMustReturnInvertedMap() {
Map<String, String> invColorMap = MapUtils.invertMap(this.colorMap);
int size = invColorMap.size();
Assertions.assertThat(invColorMap)
.hasSameSizeAs(colorMap)
.containsKeys(this.colorMap.values().toArray(new String[] {}))
.containsValues(this.colorMap.keySet().toArray(new String[] {}));
}
這會將colorMap轉換為:
{
#00FF00 = GREEN
#FF0000 = RED
#0000FF = BLUE
}
如果源映射將相同的值與多個鍵相關聯,則在反轉後,其中一個值將隨機變為一個鍵。
3.5。null檢查和空檢查
如果Map為null或為空,則isEmpty()方法返回true 。
safeAddToMap()方法可防止向地圖添加空元素。
4.裝飾器
這些方法向Map添加了其他功能。
在大多數情況下,最好不要存儲對裝飾Map的引用。
4.1。固定大小的Map
fixedSizeMap()返回由給定Map支持的固定大小的Map。元素可以更改,但不能添加或刪除:
@Test(expected = IllegalArgumentException.class)
public void whenCreateFixedSizedMapAndAdd_thenMustThrowException() {
Map<String, String> rgbMap = MapUtils
.fixedSizeMap(MapUtils.putAll(new HashMap<>(), this.color1DArray));
rgbMap.put("ORANGE", "#FFA500");
}
4.2。PredicatedMap
predicatedMap()方法返回Map,以確保所有保留的元素都與提供的謂詞匹配:
@Test(expected = IllegalArgumentException.class)
public void whenAddDuplicate_thenThrowException() {
Map<String, String> uniqValuesMap
= MapUtils.predicatedMap(this.colorMap, null,
PredicateUtils.uniquePredicate());
uniqValuesMap.put("NEW_RED", "#FF0000");
}
在這裡,我們使用PredicateUtils.uniquePredicate()為值指定謂詞。任何試圖在此映射中插入重複值的嘗試都將導致java.lang。 IllegalArgumentException 。
我們可以通過實現Predicate接口來實現自定義謂詞。
4.3。LazyMap
lazyMap()返回一個映射,其中在請求時將值初始化。
如果傳遞給此地圖的Map.get(Object)方法的鍵在地圖中不存在,則將使用Transformer實例創建將與請求的鍵關聯的新對象:
@Test
public void whenCreateLazyMap_theMapIsCreated() {
Map<Integer, String> intStrMap = MapUtils.lazyMap(
new HashMap<>(),
TransformerUtils.stringValueTransformer());
assertThat(intStrMap, is(anEmptyMap()));
intStrMap.get(1);
intStrMap.get(2);
intStrMap.get(3);
assertThat(intStrMap, is(aMapWithSize(3)));
}
5.結論
在本快速教程中,我們探討了Apache Commons Collections MapUtils類,並研究了可以簡化各種常見地圖操作的各種實用程序方法和修飾符。
和往常一樣,該代碼可在GitHub上獲得。