概述
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
目前公司项目中主要采用Hutool作为项目的工具包,相对于google的guava, hutool的工具类采用中文注释,更加符合国人使用。所谓知己知彼,我们需要了解Hutool都具有什么样的功能,才能够最大化发挥它的价值。
本文主要就hutool 5.8.8版本, 介绍其中一个操作Map哈希表的工具类MapUtil,我这边主要介绍几个比较好用的方法。
行列互转
大家是不是遇到过将多个map以key进行分组,然后相同key下的value合并成一个list的场景,现在可以通过下面的行列互转的方式轻松解决。
- toListMap:行转列,合并相同的键,值合并为列表。
- toMapList: 列转行。将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); // 调用toListMap, 将list转为map System.out.println("toListMap: "); Map<String, List<String>> listMap = MapUtil.toListMap(maps); System.out.println(listMap); // toMapList, 将map转为list System.out.println("toMapList: "); List<Map<String, String>> mapList = MapUtil.toMapList(listMap); System.out.println(mapList); }
结果:
键值互换
- 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); } 复制代码
结果:
sort排序操作
- sort(Map<K, V> map): 排序已有Map,Key有序的Map,使用默认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); }
结果:
join连接操作
- join: 将map转成字符串
- sortJoin: 根据参数排序后拼接为字符串,常用于签名
- joinIgnoreNull: 将map转成字符串,忽略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); }
过滤转换操作
- 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自定义一个规则,此规则将原Map中的元素转换成新的元素,生成新的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整除的数据 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(); // 转换操作 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方法非常不好用,有时候还需要进行判断类型等。
@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); }
总结
本文总结了MapUtil常用的一些操作,具体的大家可以查看源码,都非常简单。