日常开发效率神器【Hutool工具类】的使用

0.前言

Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法。Hutool基本上覆盖了日常开发中涉及的所有工具方法。包括字符串操作、日期操作、Excel、HTTP客户端、JSON解析等等。强烈推荐大家使用。官方文档。接下来通过项目源码中的测试用例来学习和入门Hutool,看完测试用例你就会惊叹:牛掰!Gitee和GitHub上都有这个项目,这里使用Gitee,clone会快一点。GitHub clone慢的问题也可以通过Gitee导入GitHub项目的方式解决
在这里插入图片描述

1. 项目结构

模块介绍
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封装

Hutool中有完备的注释,在实际使用中我们只需要大概知道你需要使用的工具类的名字,然后通过看源码的注释就可以直接使用了,例如:
在这里插入图片描述
当然也可以直接看API文档:https://apidoc.gitee.com/loolly/hutool/

2.常用工具类介绍

Console.log();方法是Hutool提供在控制台打印的方法,类似System.out.printf。以下实例中将使用这个方法。

2.1 字符串工具类:StrUtil

API文档 此工具类包含有28个工具方法,在实际开发中使用的频率很大。同时还继承CharSequenceUtil
字符分割可忽略空格

@Test
public void splitTest() {
	String str = "a,b ,c,d,,e";
	List<String> split = StrUtil.split(str, ',', -1, true, true);
    Console.log(split);
}

Console:
[a, b, c, d, e]

字符串处理不可见字符:

@Test
public void trimTest() {
	String blank = "	 哈哈  ";
	String trim = StrUtil.trim(blank);
	Console.log(trim);
}

Console:
哈哈

按指定长度分割字符串

@Test
public void cutTest() {
	String str = "aaabbbcccdddaadfdfsdfsdf0";
	String[] cut = StrUtil.cut(str, 4);
	Console.log(cut);
}
Console:
[aaab, bbcc, cddd, aadf, dfsd, fsdf, 0]
返回类型方法名
static StringBuilderbuilder()
创建StringBuilder对象
static StringBuilderbuilder()
创建StringBuilder对象
static StringBuilderbuilder(int capacity)
创建StringBuilder对象
static Stringfill(String str, char filledChar, int len, boolean isPre)
将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串
static StringfillBefore(String str, char filledChar, int len)
将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串 字符填充于字符串前
static Stringformat(CharSequence template, Map<?,?> map)
格式化文本,使用 {varName} 占位 map = {a: “aValue”, b: “bValue”} format("{a} and {b}", map) —=》 aValue and bValue
static Stringformat(CharSequence template, Map<?,?> map, boolean ignoreNull)
格式化文本,使用 {varName} 占位 map = {a: “aValue”, b: “bValue”} format("{a} and {b}", map) —=》 aValue and bValue
static StringReadergetReader(CharSequence str)
获得StringReader
static StringWritergetWriter()
获得StringWriter
static booleanisBlankIfStr(Object obj)
对象是字符串是否为空白
static booleanisEmptyIfStr(Object obj)
如果对象是字符串是否为空串.
static Stringreverse(String str)
反转字符串 例如:abcd =》dcba
static doublesimilar(String str1, String str2)
计算两个字符串的相似度
static Stringsimilar(String str1, String str2, int scale)
计算两个字符串的相似度百分比
static Stringstr(byte[] data, Charset charset)
解码字节码
static Stringstr(Byte[] data, Charset charset)
解码字节码
static Stringstr(byte[] bytes, String charset)
将byte数组转为字符串
static Stringstr(Byte[] bytes, String charset)
将Byte数组转为字符串
static Stringstr(ByteBuffer data, Charset charset)
将编码的byteBuffer数据转换为字符串
static Stringstr(ByteBuffer data, String charset)
将编码的byteBuffer数据转换为字符串
static Stringstr(Object obj, Charset charset)
将对象转为字符串
static Stringuuid()
生成随机UUID

2.2 数字工具类NumberUtil

API文档 以下选取常用的方法列出,详尽的API可查看文档或源码

返回类型方法名
static doubleadd(double v1, double v2)
提供精确的加法运算
static intcompare(byte x, byte y)
比较两个值的大小
static intdivisor(int m, int n)
最大公约数
static booleanequals(BigDecimal bigNum1, BigDecimal bigNum2)
比较大小,值相等 返回true 此方法通过调用BigDecimal.compareTo(BigDecimal)方法来判断是否相等 此方法判断值相等时忽略精度的,即0.00 == 0
static booleanequals(double num1, double num2)
比较大小,值相等 返回true 此方法通过调用Double.doubleToLongBits(double)方法来判断是否相等 此方法判断值相等时忽略精度的,即0.00 == 0
static booleanequals(float num1, float num2)
比较大小,值相等 返回true 此方法通过调用Float.floatToIntBits(float)方法来判断是否相等 此方法判断值相等时忽略精度的,即0.00 == 0
static booleanisInteger(String s)
判断String是否是整数 支持10进制
static booleanisNumber(CharSequence str)
是否为数字,支持包括:
static BigDecimalmax(BigDecimal… numberArray)
取最大值
static doublemax(double… numberArray)
取最大值
static intparseInt(String number)
解析转换数字字符串为int型数字,规则如下:
static longparseLong(String number)
解析转换数字字符串为long型数字,规则如下:
static NumberparseNumber(String numberStr)
将指定字符串转换为Number 对象
static intpartValue(int total, int partCount)
把给定的总数平均分成N份,返回每份的个数 当除以分数有余数时每份+1
static int[]range(int stop)
从0开始给定范围内的整数列表,步进为1
static BigDecimalround(BigDecimal number, int scale)
保留固定位数小数 采用四舍五入策略 RoundingMode.HALF_UP例如保留2位小数:123.456789 =》 123.46

2.3 BeanUtil

API文档 把一个拥有对属性进行set和get方法的类,我们就可以称之为JavaBean。日常开发中我们也时常遇到Bean之间转换的需求,map,list之间的转换。使用此工具类也会特别方便。

返回类型方法名
static Map<String,Object>beanToMap(Object bean)
对象转Map,不进行驼峰转下划线,不忽略值为空的字段
static Map<String,Object]]>beanToMap(Object bean, boolean isToUnderlineCase, boolean ignoreNullValue)
对象转Map
static voidcopyProperties(Object source, Object target, boolean ignoreCase)
复制Bean对象属性
static voiddescForEach(Class<?> clazz, Consumer<? super PropDesc> action)
遍历Bean的属性
static TfillBeanWithMap(Map<?,?> map, T bean, boolean isIgnoreError)
使用Map填充Bean对象
static TtoBean(Class beanClass, ValueProvider valueProvider, CopyOptions copyOptions)
ServletRequest 参数转Bean
static TtoBean(Object source, Class clazz)
对象或Map转Bean
static TtoBean(Object source, Class clazz, CopyOptions options)
对象或Map转Bean
static TtoBeanIgnoreCase(Object source, Class clazz, boolean ignoreError)
对象或Map转Bean,忽略字段转换时发生的异常
static TtoBeanIgnoreError(Object source, Class clazz)
对象或Map转Bean,忽略字段转换时发生的异常
static TtrimStrFields(T bean, String… ignoreFields)
把Bean里面的String属性做trim操作。此方法直接对传入的Bean做修改。

2.4 ObjectUtil 对象工具类

API文档 对象工具类,包括判空、克隆、序列化等操作。比如一个集合的size为0,我们需要判断它的size才能知道它是不是为空。isEmpty方法就解决了这个问题。

返回类型方法名
static Tclone(T obj)
克隆对象 如果对象实现Cloneable接口,调用其clone方法 如果实现Serializable接口,执行深度克隆 否则返回null
static booleancontains(Object obj, Object element)
对象中是否包含元素 支持的对象类型包括: String Collection Map Iterator Enumeration Array
static <T extends CharSequence]]> TdefaultIfBlank(T str, T defaultValue)
如果给定对象为null或者""或者空白符返回默认值
static TdefaultIfEmpty(String str, Supplier<? extends T> handle, T defaultValue)
如果给定对象为null或者""返回默认值, 否则返回自定义handle处理后的返回值
static booleanequal(Object obj1, Object obj2)
比较两个对象是否相等。 相同的条件有两个,满足其一即可: obj1 == null && obj2 == null obj1.equals(obj2) 如果是BigDecimal比较,0 == obj1.compareTo(obj2)
static booleanhasEmpty(Object… objs)
是否存在null或空对象,通过isEmpty(Object) 判断元素
static booleanhasNull(Object… objs)
是否存在null对象,通过isNull(Object) 判断元素
static booleanisAllEmpty(Object… objs)
是否全都为null或空对象,通过isEmpty(Object) 判断元素
static booleanisEmpty(Object obj)
判断指定对象是否为空,如果为集合,size为0也会认为为空
static StringtoString(Object obj)
将Object转为String 策略为:

2.5 时间工具类DateUtil

API文档 日期格式化,日期之间相隔多少天,一天的开始时间结束时间等等

返回类型方法名
static intageOfNow(String birthDay)
生日转为年龄,计算法定年龄
static DateTimebeginOfDay(Date date)
获取某天的开始时间
static DateTimebeginOfHour(Date date)
获取某小时的开始时间
static DateTimebeginOfMonth(Date date)
获取某月的开始时间
static longbetweenDay(Date beginDate, Date endDate, boolean isReset)
判断两个日期相差的天数
static longcurrent()
当前时间的时间戳
static DateTimeendOfHour(Date date)
获取某小时的结束时间
static Stringformat(Date date, DateFormat format)
根据特定格式格式化日期
static StringformatDateTime(Date date)
格式化日期时间格式 yyyy-MM-dd HH:mm:ss
static booleanisAM(Date date)
是否为上午
static booleanisLeapYear(int year)
是否闰年
static Stringtoday()
当前日期,格式 yyyy-MM-dd
static DateTimetomorrow()
明天
static intyear(Date date)
获得年的部分

2.6 工具类JSONUtil

API文档 该工具类也是根据阿里的fastjson封装的。

返回类型方法名
static JSONArraycreateArray()
static JSONArraycreateArray(JSONConfig config)创建 JSONArray
static booleanisJson(String str)
是否为JSON字符串,首尾都为大括号或中括号判定为JSON字符串
static JSONArrayparseArray(Object arrayOrCollection)JSON字符串转JSONArray
static JSONObjectparseObj(Object obj)
JSON字符串转JSONObject对象此方法会忽略空值,但是对JSON字符串不影响
static JSONreadJSON(File file, Charset charset)读取JSON
static TtoBean(JSON json, Type beanType, boolean ignoreError)转为实体类对象
static StringtoJsonPrettyStr(Object obj)
转换为格式化后的JSON字符串

2.7 工具类JSONObject

API文档

返回类型方法名
JSONObjectaccumulate(String key, Object value)
积累值。类似于set,当key对应value已经存在时,与value组成新的JSONArray.
JSONObjectappend(String key, Object value)
追加值,如果key无对应值,就添加一个JSONArray,其元素只有value,如果值已经是一个JSONArray,则添加到值JSONArray中。
ObjectgetByPath(String expression)
通过表达式获取JSON中嵌套的对象.表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值 []表达式,可以获取集合等对象中对应index的值
JSONObjectincrement(String key)
对值加一,如果值不存在,赋值1,如果为数字类型,做加一操作
JSONObjectputOnce(String key, Object value)
一次性Put 键值对,如果key已经存在抛出异常,如果键值中有null值,忽略
JSONObjectputOpt(String key, Object value)
在键和值都为非空的情况下put到JSONObject中
JSONObjectset(String key, Object value)
设置键值对到JSONObject中,在忽略null模式下,如果值为null,将此键移除
JSONObjectsetDateFormat(String format)
设置转为字符串时的日期格式,默认为时间戳(null值)此方法设置的日期格式仅对转换为JSON字符串有效,对解析JSON为bean无效。

2.8 JSONArray

API文档

返回类型方法名
JSONArrayput(int index, Object value)
加入或者替换JSONArray中指定Index的值,如果index大于JSONArray的长度,将在指定index设置值,之前的位置填充JSONNull.Null
JSONArraysetDateFormat(String format)
设置转为字符串时的日期格式,默认为时间戳(null值)
JSONObjecttoJSONObject(JSONArray names)
根据给定名列表,与其位置对应的值组成JSONObject
ListtoList(Class elementType)
转为ArrayList
StringtoString()
转为JSON字符串,无缩进

2.9 excel工具类ExcelUtil

API文档 excel工具类引入了第三方的POI,对Excel读取文件流后使用ExcelReader工具对excel进行操作

返回类型方法名
static ExcelReadergetReader(File bookFile, int sheetIndex)
获取Excel读取器,通过调用ExcelReader的read或readXXX方法读取Excel内容
static ExcelReadergetReader(File bookFile, String sheetName)
获取Excel读取器,通过调用ExcelReader的read或readXXX方法读取Excel内容
static ExcelReadergetReader(InputStream bookStream)
获取Excel读取器,通过调用ExcelReader的read或readXXX方法读取Excel内容 默认调用第一个sheet,读取结束自动关闭流

ExcelReader

查看Hutool源码中的测试用例了解到,可以读取excel内容并转化为一个bean

	@Test
	public void excelReadToBeanListTest2() {
		ExcelReader reader = ExcelUtil.getReader("f:/test/toBean.xlsx");
		reader.addHeaderAlias("姓名", "name");
		reader.addHeaderAlias("年龄", "age");
		reader.addHeaderAlias("性别", "gender");

		List<Person> all = reader.read(0, 2, Person.class);
		for (Person person : all) {
			Console.log(person);
		}
	}

当excel中数据量特别大的时候也可以使用Sax的方式进行读取。

ExcelWriter

写入一个bean也是可以的

	@Test
	public void writeBeanTest() {
		List<cn.hutool.poi.excel.TestBean> rows = CollUtil.newArrayList(bean1, bean2);
		// 通过工具类创建writer
		String file = "e:/writeBeanTest.xlsx";
		FileUtil.del(file);
		ExcelWriter writer = ExcelUtil.getWriter(file);
		// 自定义标题
		writer.addHeaderAlias("name", "姓名");
		writer.addHeaderAlias("age", "年龄");
		writer.addHeaderAlias("score", "分数");
		writer.addHeaderAlias("isPass", "是否通过");
		writer.addHeaderAlias("examDate", "考试时间");
		// 合并单元格后的标题行,使用默认标题样式
		writer.merge(4, "一班成绩单");
		// 一次性写出内容,使用默认样式
		writer.write(rows, true);
		// 关闭writer,释放内存
		writer.close();
	}

之前一直使用阿里的easyExcel,发现hutool中excel相关的工具类也有很多包括Cell工具类、Sheet工具类等等,在实际开发中也可以方便的使用。具体的使用也可以直接看测试用例

2.10集合工具类CollUtil

API文档

返回类型方法名
static intcount(Iterable iterable, Matcher matcher)
集合中匹配规则的数量
static <K,V> Map<K,V>createMap(Class<?> mapType)
创建Map传入AbstractMap和Map类将默认创建HashMap
static <T extends Collection,E>filter(T collection, Filter filter)
去除指定元素,此方法直接修改原集合
static voidforEach(Enumeration enumeration, CollUtil.Consumer consumer)
循环遍历 Enumeration,使用CollUtil.Consumer 接受遍历的每条数据,并针对每条数据做处理
static TgetFirst(Iterable iterable)
获取集合的第一个元素
static TgetLast(Collection collection)
获取集合的最后一个元素
static booleanhasNull(Iterable<?> iterable)
是否包含null元素
static <K,V> HashMap<K,V>toMap(Iterable<Map.Entry<K,V>> entryIter)
将Entry集合转换为HashMap
static <K,V> List<Map<K,V>>toMapList(Map<K,? extends Iterable> listMap)
列转行。将Map中值列表分别按照其位置与key组成新的map。是toListMap(Iterable)的逆方法
static <K,V> Map<K,V>zip(Collection keys, Collection values)
映射键值(参考Python的zip()函数)例如:keys = [a,b,c,d]values = [1,2,3,4]则得到的Map是 {a=1, b=2, c=3, d=4}如果两个数组长度不同,则只对应最短部分

3. 总结

以上列出的工具只是冰山一角,具体的使用可以看官方文档,感觉业务系统中的工具类方法基本全覆盖了包括:类型转换、日期时间、IO流相关、系统资源、字符串、Hash算法、URL工具、对像工具、类工具、枚举工具、命令行工具、数字工具、随机工具、唯一ID工具、压缩工具、正则工具、身份证工具、集合、map、文本、图片、网络、加密解密、http客户端、图片验证码等等。学习里面的使用最好先看源码中的测试用例。同时看源码的过程中可以学习别人写的代码。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值