何必重复造轮子,这个类库用起来贼上瘾!

579 阅读7分钟

概览

Hutool是一个小而全的Java工具类库,大分部是通过静态方法封装,降低API的学习成本,帮忙我们大大的简化代码,避免重复造轮子。

使用Hutool后,项目中基本上没有公用类和工具方法的封装,可以使我们更加专注业务的开发,大大提升了开发效率,下面我将会介绍下

我工作中常用的几个工具类,希望对大家的开发有所帮助。

如何安装

Hutool的官方地址:hutool.cn 官方的文档很详细

  • Maven

    在项目的pom.xml的dependencies中加入以下内容:

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.5.6</version>
    </dependency>
    
  • Gradle

    compile 'cn.hutool:hutool-all:5.5.6'
    

常用工具类

类型转换工具类-Convert

// 1.转换为字符串
int a = 1;
String aStr = Convert.toStr(a);

// 2.转换为指定类型数组
String[] b = {"1","2","3","4"};
Integer[] intArray = Convert.toIntArray(b);

// 3.转换为日期
String c = "2021-01-10";
Date date = Convert.toDate(c);

// 4.转换为集合
Object[] d = {"1","2","3","4"};
List<?> list = Convert.toList(d);

// 5.半角和全角转换
String e = "123456789";
String eStr = Convert.toSBC(e);
//结果为:"123456789"
String f = "123456789";
String fStr = Convert.toDBC(f);
//结果为:"123456789"

// 6.16进制(Hex)
String g = "字符串";
String hex = Convert.toHex(g, CharsetUtil.CHARSET_UTF_8);
//结果为:e5ad97e7aca6e4b8b2
String raw = Convert.hexToStr(hex,CharsetUtil.CHARSET_UTF_8);

// 7.Unicode和字符串转换
String i = "字符串";
String unicode = Convert.strToUnicode(i);
//结果为:\u5b57\u7b26\u4e32
String iRaw = Convert.unicodeToStr(unicode);

// 8.编码转换
String j = "字符串";
String result = Convert.convertCharset(j, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
String jRaw = Convert.convertCharset(result,CharsetUtil.ISO_8859_1,CharsetUtil.UTF_8);

// 9.时间单位转换
long k = 10000;
long minutes = Convert.convertTime(k, TimeUnit.SECONDS, TimeUnit.MINUTES);

// 10. 金额大小写转换
double l = 643.34;
String digitUppercase = Convert.digitToChinese(l);
//结果为:陆佰肆拾叁元叁角肆分

日期时间工具-DateUtil

//当前时间
Date date1 = DateUtil.date();
//当前时间
Date date2 = DateUtil.date(Calendar.getInstance());
//当前时间
Date date3 = DateUtil.date(System.currentTimeMillis());
//当前时间字符串,格式:yyyy-MM-dd HH:mm:ss
String now = DateUtil.now();
//当前日期字符串,格式:yyyy-MM-dd
String today= DateUtil.today();

//字符串转日期
String dateStr = "2021-01-10";
Date date4 = DateUtil.parse(dateStr);

//格式化日期
DateUtil.format(date4, "yyyy/MM/dd");

//获取Date对象的某个部分
//获得年的部分
DateUtil.year(date4);
//获得月份,从0开始计数
DateUtil.month(date4);

//开始和结束时间
//一天的开始,结果:2017-03-01 00:00:00
Date beginOfDay = DateUtil.beginOfDay(date4);
//一天的结束,结果:2017-03-01 23:59:59
Date endOfDay = DateUtil.endOfDay(date4);

//日期时间偏移
Date newDate = DateUtil.offset(date1, DateField.DAY_OF_MONTH, 2);
DateTime newDate2 = DateUtil.offsetDay(date1, 3);
DateTime newDate3 = DateUtil.offsetHour(date1, -3);
//昨天
DateUtil.yesterday();
//明天
DateUtil.tomorrow();
//上周
DateUtil.lastWeek();
//下周
DateUtil.nextWeek();
//上个月
DateUtil.lastMonth();
//下个月
DateUtil.nextMonth();

//日期时间差
String dateStr1 = "2017-03-01 22:33:23";
Date date5 = DateUtil.parse(dateStr1);

String dateStr2 = "2017-04-01 23:33:23";
Date date6 = DateUtil.parse(dateStr2);
long betweenDay = DateUtil.between(date5, date6, DateUnit.DAY);

//星族和属相
// "摩羯座"
String zodiac = DateUtil.getZodiac(Month.JANUARY.getValue(), 19);
// "狗"
String chineseZodiac = DateUtil.getChineseZodiac(1994);

文件读取-FileReader

//默认UTF-8编码,可以在构造中传入第二个参数做为编码
FileReader fileReader = new FileReader("test.properties");
String result = fileReader.readString();

文件写入-FileWriter

FileWriter writer = new FileWriter("test.properties");
writer.write("test");

字符串工具-StrUtil

// 1.hasBlank、hasEmpty方法
StrUtil.hasBlank();
StrUtil.hasEmpty();
// hasEmpty只判断是否为null或者空字符串(""),hasBlank则会把不可见字符也算做空

// 2.removePrefix、removeSuffix方法,去掉字符串前缀后缀
String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg");
//fileName -> pretty_girl

// 3.sub方法
String str1 = "abcdefgh";
String strSub1 = StrUtil.sub(str1, 2, 3);
//strSub1 -> c
String strSub2 = StrUtil.sub(str1, 2, -3);
//strSub2 -> cde
String strSub3 = StrUtil.sub(str1, 3, 2);
//strSub2 -> c

// 4.format方法
String template = "{}爱{},就像老鼠爱大米";
String str2 = StrUtil.format(template, "我", "你");
//str2 -> 我爱你,就像老鼠爱大米

反射工具-ReflectUtil

// 1.获取某个类的所有方法
Method[] methods = ReflectUtil.getMethods(ReflectUtilTest.class);

// 2.获取某个类的指定方法
Method method = ReflectUtil.getMethod(ReflectUtilTest.class, "main");

// 3.构造对象
ReflectUtil.newInstance(ReflectUtilTest.class);

// 4.执行方法
ReflectUtilTest reflectUtilTest = new ReflectUtilTest();
ReflectUtil.invoke(reflectUtilTest, "main");

唯一ID工具-IdUtil

// 1.uuid
//生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
String uuid = IdUtil.randomUUID();
//生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID = IdUtil.simpleUUID();

// 2.ObjectId
//生成类似:5b9e306a4df4f8c54a39fb0c
String id = ObjectId.next();
//方法2:从Hutool-4.1.14开始提供
String id2 = IdUtil.objectId();

// 3.Snowflake
//workerId为终端ID,datacenterId为数据中心ID
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
long id3 = snowflake.nextId();

断言-Assert

String a = null;
//是否为null
Assert.isNull(a);

//isTrue 是否True
//isNull 是否是null值,不为null抛出异常
//notNull 是否非null值
//notEmpty 是否非空
//notBlank 是否非空白符
//notContain 是否为子串
//notEmpty 是否非空
//noNullElements 数组中是否包含null元素
//isInstanceOf 是否类实例
//isAssignable 是子类和父类关系

Bean工具-BeanUtil

// 1.BeanUtil.fillBeanWithMap 使用Map填充bean
HashMap<String, Object> map1 = CollUtil.newHashMap();
map1.put("name", "Joe");
map1.put("age", 12);
map1.put("openId", "DFDFSDFWERWER");
SubPerson person1 = BeanUtil.fillBeanWithMap(map1, new SubPerson(), false);

// 2.BeanUtil.fillBeanWithMapIgnoreCase 使用Map填充bean,忽略大小写
HashMap<String, Object> map2 = CollUtil.newHashMap();
map2.put("Name", "Joe");
map2.put("aGe", 12);
map2.put("openId", "DFDFSDFWERWER");
SubPerson person2 = BeanUtil.fillBeanWithMapIgnoreCase(map2, new SubPerson(), false);

// 3.BeanUtil.mapToBean map转bean的方法,与fillBean不同的是,此处并不是传Bean对象,而是Bean类
HashMap<String, Object> map3 = CollUtil.newHashMap();
map3.put("a_name", "Joe");
map3.put("b_age", 12);
// 设置别名,用于对应bean的字段名
HashMap<String, String> mapping = CollUtil.newHashMap();
mapping.put("a_name", "name");
mapping.put("b_age", "age");
Person person = BeanUtil.mapToBean(map3, Person.class, CopyOptions.create().setFieldMapping(mapping));

// 4.Bean转Map
SubPerson person3 = new SubPerson();
person.setAge(14);
person.setOpenid("11213232");
person.setName("测试A11");
person.setSubName("sub名字");
Map<String, Object> map = BeanUtil.beanToMap(person);

// 5.Bean转Bean
SubPerson subPerson = new SubPerson();
subPerson.setSlow(true);
subPerson.setName("测试");
subPerson.setSubName("sub测试");
Person person4 = new Person();
BeanUtil.copyProperties(subPerson, person4);

集合工具-CollUtil

// 1.join方法
String[] col= new String[]{"a","b","c","d","e"};
List<String> colList = CollUtil.newArrayList(col);
String str = CollUtil.join(colList, "#");
//str -> a#b#c#d#e

// 2.newHashMap、newHashSet、newArrayList方法
HashMap<String, String> map = CollUtil.newHashMap();
HashSet<String> set = CollUtil.newHashSet();
ArrayList<String> list = CollUtil.newArrayList();

// 3. zip方法 给定两个集合,然后两个集合中的元素一一对应,成为一个Map
Collection<String> keys = CollUtil.newArrayList("a", "b", "c", "d");
Collection<Integer> values = CollUtil.newArrayList(1, 2, 3, 4);

Map<String, Integer> map2 = CollUtil.zip(keys, values);
// {a=1,b=2,c=3,d=4}

列表工具-ListUtil

// 1.过滤列表
List<String> list1 = ListUtil.toLinkedList("1", "2", "3");
List<String> filter = ListUtil.filter(list1, str -> "edit" + str);
// 结果: [edit1, edit2, edit3]

// 2.获取满足指定规则所有的元素的位置
List<String> list2 = ListUtil.toLinkedList("1", "2", "3", "4", "3", "2", "1");
int[] indexArray = ListUtil.indexOfAll(list2, "2"::equals);
// [1, 5]

Map工具-MapUtil

// 1.newHashMap 快速创建多种类型的HashMap实例
Map map1 = MapUtil.newHashMap();

// 2.createMap 创建自定义的Map类型的Map
Map map2 = MapUtil.createMap(Integer.class);

// 3.of 此方法将一个或多个键值对加入到一个新建的Map中
Map<Object, Object> colorMap = MapUtil.of(new String[][] {
        {"RED", "#FF0000"},
        {"GREEN", "#00FF00"},
        {"BLUE", "#0000FF"}
});

// 4.join、joinIgnoreNull、sortJoin将Map按照给定的分隔符转换为字符串
Map<String, String> build = MapUtil.builder(new HashMap<String, String>())
        .put("key1", "value1")
        .put("key3", "value3")
        .put("key2", "value2").build();
String join1 = MapUtil.sortJoin(build, StrUtil.EMPTY, StrUtil.EMPTY, false);
// key1value1key2value2key3value3
String join2 = MapUtil.sortJoin(build, StrUtil.EMPTY, StrUtil.EMPTY, false, "123");
// key1value1key2value2key3value3123

// 5.filter 过滤过程通过传入的Editor实现来返回需要的元素内容
Map<String, String> map = MapUtil.newHashMap();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("d", "4");
Map<String, String> map3 = MapUtil.filter(map, (Filter<Map.Entry<String, String>>) t -> Convert.toInt(t.getValue()) % 2 == 0);
//{b: "2",d: "4"}

// 6.reverse Map的键和值互换
Map<String, String> map4 = MapUtil.newHashMap();
map4.put("a", "1");
map4.put("b", "2");
map4.put("c", "3");
map4.put("d", "4");

Map<String, String> map5 = MapUtil.reverse(map4);
//{"1": "a","2": "b","3": "c","4": "d",}

其他工具

以上的工具,是我工作中使用频率最高的,还有很多其它好用的工具,如下表所示,喜欢的朋友可以自行研究~~

模块介绍
hutool-aopJDK动态代理封装,提供非IOC下的切面支持
hutool-bloomFilter布隆过滤,提供一些Hash算法的布隆过滤
hutool-cache简单缓存实现
hutool-core核心,包括Bean操作、日期、各种Util等
hutool-cron定时任务模块,提供类Crontab表达式的定时任务
hutool-crypto加密解密模块,提供对称、非对称和摘要算法封装
hutool-dbJDBC封装后的数据操作,基于ActiveRecord思想
hutool-dfa基于DFA模型的多关键字查找
hutool-extra扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)
hutool-http基于HttpUrlConnection的Http客户端封装
hutool-log自动识别日志实现的日志门面
hutool-script脚本执行封装,例如Javascript
hutool-setting功能更强大的Setting配置文件和Properties封装
hutool-system系统参数调用封装(JVM信息等)
hutool-jsonJSON实现
hutool-captcha图片验证码实现
hutool-poi针对POI中Excel和Word的封装
hutool-socket基于Java的NIO和AIO的Socket封装

项目源码

github: github.com/dragon8844/…

最后说一句

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下,您的支持是我坚持写作最大的动力,多谢支持。

此外,关注公众号:黑色的灯塔,专注Java后端技术分享,涵盖Spring,Spring Boot,SpringCloud,Docker,Kubernetes中间件等技术。