Apache Commons Collections MapUtils

1.簡介

MapUtils是Apache Commons Collections項目中可用的工具之一。

簡而言之,它提供了實用程序方法和修飾符以與java.util.Mapjava.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檢查和空檢查

如果Mapnull或為空,則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上獲得