开发利器Hutool之MapUtil的使用

简介: 开发利器Hutool之MapUtil的使用

概述


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);
}

结果:

1671192272991.jpg


键值互换1671192295215.jpg

  • 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);
}
复制代码

结果:

1671192295215.jpg


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);
    }

结果:

1671192331015.jpg


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方法非常不好用,有时候还需要进行判断类型等。

1671192366057.jpg

@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常用的一些操作,具体的大家可以查看源码,都非常简单。

目录
相关文章
SpringBoot 集成log4j2
SpringBoot 集成log4j2
644 0
SpringBoot 集成log4j2
|
XML Dubbo fastjson
FastJson - 设置默认参数,全局配置方式及爬坑
FastJson - 设置默认参数,全局配置方式及爬坑
2457 0
|
Java API Maven
全网首发:Spring Cloud Gateway设置统一的请求前缀
全网首发:Spring Cloud Gateway设置统一的请求前缀
2178 0
全网首发:Spring Cloud Gateway设置统一的请求前缀
|
负载均衡 Java 微服务
OpenFeign:让微服务调用像本地方法一样简单
OpenFeign是Spring Cloud中声明式微服务调用组件,通过接口注解简化远程调用,支持负载均衡、服务发现、熔断降级、自定义拦截器与编解码,提升微服务间通信开发效率与系统稳定性。
1008 156
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
827 3
|
程序员
【工具使用】Intellij IDEA 自动清除无效 import 包 和 清除无效 import包 的快捷键
【工具使用】Intellij IDEA 自动清除无效 import 包 和 清除无效 import包 的快捷键
5925 0
|
NoSQL Java Redis
springboot怎么使用Redisson
通过以上步骤,已经详细介绍了如何在Spring Boot项目中使用Redisson,包括添加依赖、配置Redisson、创建配置类以及使用Redisson实现分布式锁和分布式集合。Redisson提供了丰富的分布式数据结构和工具,可以帮助开发者更高效地实现分布式系统。通过合理使用这些工具,可以显著提高系统的性能和可靠性。
4279 34
|
存储 JSON fastjson
再也不用心惊胆战地使用FastJSON了——序列化篇
本篇将主要介绍json序列化的详细流程。本文阅读的FastJSON源码版本为2.0.31。
4561 49
|
安全 Java 数据安全/隐私保护
springSecurity学习之springSecurity过滤web请求
通过配置 Spring Security 的过滤器链,开发者可以灵活地管理 Web 请求的安全性。理解核心过滤器的作用以及如何配置和组合这些过滤器,可以帮助开发者实现复杂的安全需求。通过具体的示例代码,可以清晰地了解 Spring Security 的配置方法和实践。
737 23
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
4658 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具