Hutool開發(fā)MapUtil工具類使用示例
概述
Hutool是一個小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語言般的優(yōu)雅,讓Java語言也可以“甜甜的”。
目前公司項(xiàng)目中主要采用Hutool作為項(xiàng)目的工具包,相對于google的guava, hutool的工具類采用中文注釋,更加符合國人使用。所謂知己知彼,我們需要了解Hutool都具有什么樣的功能,才能夠最大化發(fā)揮它的價值。
本文主要就hutool 5.8.8版本, 介紹其中一個操作Map哈希表的工具類MapUtil,我這邊主要介紹幾個比較好用的方法。
行列互轉(zhuǎn)
大家是不是遇到過將多個map以key進(jìn)行分組,然后相同key下的value合并成一個list的場景,現(xiàn)在可以通過下面的行列互轉(zhuǎn)的方式輕松解決。
- toListMap:行轉(zhuǎn)列,合并相同的鍵,值合并為列表。
- toMapList: 列轉(zhuǎn)行。將Map中值列表分別按照其位置與key組成新的map。
@Test
public void toListMapTest() {
Map<String, String> map1 = MapUtil.of("a", "1");
Map<String, String> map2 = MapUtil.of("a", "5");
Map<String, String> map3 = MapUtil.of("b", "4");
Map<String, String> map4 = MapUtil.of("a", "5");
List<Map<String, String>> maps = new ArrayList<>();
maps.add(map1);
maps.add(map2);
maps.add(map3);
maps.add(map4);
// 調(diào)用toListMap, 將list轉(zhuǎn)為map
System.out.println("toListMap: ");
Map<String, List<String>> listMap = MapUtil.toListMap(maps);
System.out.println(listMap);
// toMapList, 將map轉(zhuǎn)為list
System.out.println("toMapList: ");
List<Map<String, String>> mapList = MapUtil.toMapList(listMap);
System.out.println(mapList);
}
結(jié)果:

鍵值互換
- inverse或者reverse方法,Map的鍵和值互換
@Test
public void inverseTest() {
Map<String, String> map = MapUtil.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "1");
Map<String, String> inverse = MapUtil.inverse(map);
System.out.println(inverse);
}
結(jié)果:

sort排序操作
sort(Map<K, V> map): 排序已有Map,Key有序的Map,使用默認(rèn)Key排序方式(字母順序)
sort(Map<K, V> map, Comparator<? super K> comparator):排序已有Map,Key有序的Map
sortByValue(Map<K, V> map, boolean isDesc):按照值排序,可選是否倒序
@Test
public void sortTest() {
Map<String, String> map = MapUtil.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "1");
// 排序, 不會改變原來的值
Map<String, String> newMap = MapUtil.sortByValue(map, true);
System.out.println(newMap);
}
結(jié)果:

join連接操作
- join: 將map轉(zhuǎn)成字符串
- sortJoin: 根據(jù)參數(shù)排序后拼接為字符串,常用于簽名
- joinIgnoreNull: 將map轉(zhuǎn)成字符串,忽略null的鍵和值
@Test
public void joinTest() {
Map<String, String> map = MapUtil.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "1");
// join
String str = MapUtil.join(map, ",", "-");
System.out.println(str);
}
過濾轉(zhuǎn)換操作
- filter(Map<K, V> map, K... keys): 過濾Map保留指定鍵值對,如果鍵不存在跳過
- filter(Map<K, V> map, Filter<Entry<K, V>> filter):自定義過濾行為
- map(Map<K, V> map, BiFunction<K, V, R> biFunction):通過biFunction自定義一個規(guī)則,此規(guī)則將原Map中的元素轉(zhuǎn)換成新的元素,生成新的Map返回
@Test
public void filterTest() {
Map<String, String> map = MapUtil.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("d", "4");
// 過濾出被2整除的數(shù)據(jù)
Map<String, String> map2 = MapUtil.filter(map, t -> Convert.toInt(t.getValue()) % 2 == 0);
Assert.assertEquals(2, map2.size());
Assert.assertEquals("2", map2.get("b"));
Assert.assertEquals("4", map2.get("d"));
}
@Test
public void mapTest() {
// Add test like a foreigner
Map<Integer, String> adjectivesMap = MapUtil.<Integer, String>builder()
.put(0, "lovely")
.put(1, "friendly")
.put(2, "happily")
.build();
// 轉(zhuǎn)換操作
Map<Integer, String> resultMap = MapUtil.map(adjectivesMap, (k, v) -> v + " " + PeopleEnum.values()[k].name().toLowerCase());
Assert.assertEquals("lovely girl", resultMap.get(0));
Assert.assertEquals("friendly boy", resultMap.get(1));
Assert.assertEquals("happily child", resultMap.get(2));
}
獲取get
get操作一定是map非常常用的方法,原生的get方法非常不好用,有時候還需要進(jìn)行判斷類型等。

@Test
public void getTest() {
Map<String, Object> map = MapUtil.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "1");
map.put("age", 20);
String value = MapUtil.getStr(map, "a");
Assert.assertEquals(value, "1");
int val = MapUtil.getInt(map, "age", 18);
Assert.assertTrue(val == 20);
}
總結(jié)
本文總結(jié)了MapUtil常用的一些操作,具體的大家可以查看源碼,都非常簡單,更多關(guān)于Hutool MapUtil工具類的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java使用MulticastSocket實(shí)現(xiàn)組播
這篇文章主要為大家詳細(xì)介紹了java使用MulticastSocket實(shí)現(xiàn)組播,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01
SpringBoot整合MinIO實(shí)現(xiàn)文件上傳的方法詳解
一般涉及到文件上傳,基本上都是保存在項(xiàng)目本地,這種方式比較省事,但是安全性不高。所以今天給大伙詳細(xì)介紹一些如何利用MinIO實(shí)現(xiàn)文件上傳,感興趣的可以了解一下2022-05-05
Open-Feign整合hystrix降級熔斷實(shí)戰(zhàn)記錄
這篇文章主要介紹了Open-Feign整合hystrix降級熔斷實(shí)戰(zhàn)記錄,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
JAVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析
下面小編就為大家?guī)硪黄狫AVA基礎(chǔ)之基本數(shù)據(jù)類型全面解析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07
Springboot如何統(tǒng)一處理Filter異常
這篇文章主要介紹了Springboot如何統(tǒng)一處理Filter異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

