
前言
Hutool是一个Java工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法。Hutool基本上覆盖了日常开发中涉及的所有工具方法。包括字符串操作、日期操作、Excel、HTTP客户端、JSON解析等等,强烈推荐大家使用。

一、概述
1.1 工具简介
在日常 Java 开发中我们要面对各种各样的类型转换问题,尤其是从命令行获取的用户参数、从HttpRequest获取的Parameter等等,这些参数类型多种多样,我们怎么去转换他们呢?常用的办法是先整成String,然后调用XXX.parseXXX方法,还要承受转换失败的风险,不得不加一层try catch,这个小小的过程混迹在业务代码中会显得非常难看和臃肿。
Convert 类可以说是一个工具方法类,里面封装了针对Java常见类型的转换,用于简化类型转换。Convert类中大部分方法为toXXX,参数为Object,可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值。Convert类可以说是一个工具方法类,里面封装了针对Java常见类型的转换,用于简化类型转换。Convert类中大部分方法为toXXX,参数为Object,可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值。
1.2 引入依赖
在使用Hutool工具之前,我们需要将Hutool添加到项目的依赖中。如果使用Maven构建项目,可以在 pom.xml 文件中添加以下依赖:
xml
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
Hutool-all 是一个 Hutool 的集成打包产品,由于考虑到"懒人"用户及分不清各个模块作用的用户,"无脑"引入 hutool-all 模块是快速开始和深入应用的最佳方式。如果你想像 SpringBoot 一样引入 Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-bom</artifactId>
<version>${hutool.version}</version>
<type>pom</type>
<!-- 注意这里是import -->
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后再在子模块中就可以引入自己需要的模块了:
xml
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
</dependency>
</dependencies>
二、工具常用方法
常用方法如下表所示:
方法 | 说明 |
---|---|
bytesToInt | |
bytesToLong | |
bytesToShort | |
byteToUnsignedInt | |
chineseMoneyToNumber | 中文大写数字金额转换为数字,返回结果以元为单位的BigDecimal类型数字。 如:"陆万柒仟伍佰伍拾陆元叁角贰分"返回"67556.32""叁角贰分"返回"0.32" |
chineseToNumber | 数字中文表示形式转数字。例如,一百一十二-》112 |
convert | 转换值为指定类型 |
convertByClassName | 转换值为指定类型,类型采用字符串表示 |
convertCharset | 给定字符串转换字符编码。如果参数为空,则返回原字符串,不报错。 |
convertQuietly | 转换值为指定类型,不抛异常转换。当转换失败时返回null |
convertTime | 主要用于转换时间单位 |
convertWithCheck | 转换值为指定类型,可选是否不抛异常转换。当转换失败时返回默认值 |
digitToChinese | 金额大小写转换 |
hexToBytes | Hex字符串转换为Byte值 |
hexToStr | 将16进制(Hex)字符串转为普通字符串 |
intToByte | |
intToBytes | |
longToBytes | |
numberToChinese | 数字中文转换为数字,只保留两位小数 |
numberToSimple | 将阿拉伯数字转为精简表示形式 |
numberToWord | 数字转为英文表达 |
shortToBytes | |
strToUnicode | String的字符串转换成unicode的String |
toBigDecimal | 转换为BigDecimal。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toBigInteger | 转换为BigInteger。如果给定的值为空,或者转换失败,返回默认值null,转换失败不会报错 |
toBool | 转换为boolean。如果给定的值为空,或者转换失败,返回默认值null,转换失败不会报错 |
toBooleanArray | 转换为指定类型数组 |
toByte | 转换为byte。如果给定的值为null,或者转换失败,返回默认值null,转换失败不会报错 |
toByteArray | 转换为指定类型数组 |
toChar | 转换为字符。如果给定的值为null,或者转换失败,返回默认值null,转换失败不会报错 |
toCharArray | 转换为指定类型数组 |
toCollection | |
toDate | 转换为Date。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toDBC | 全角转半角 |
toDouble | 转换为double。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toDoubleArray | 转换为指定类型数组 |
toEnum | 转换为Enum对象。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toFloat | 转换为Float。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toFloatArray | 转换为指定类型数组 |
toHex | 转为16进制(Hex)字符串 |
toInstant | 如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toInt | 如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toIntArray | 转换为指定类型数组 |
toList | 转换为集合 |
toLocalDateTime | 转换为LocalDateTime。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toLong | 转换为long。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toLongArray | 转换为指定类型数组 |
toMap | 转换为Map,若value原本就是Map,则转为原始类型,若不是则默认转为HashMap |
toNumber | 转换为Number。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toNumberArray | 转换为指定类型数组 |
toPrimitiveByteArray | 转换为指定类型数组 |
toSBC | 半角转全角 |
toSet | 转换为HashSet |
toShort | 转换为Short。如果给定的值为空,或者转换失败,返回null,转换失败不会报错 |
toShortArray | 转换为指定类型数组 |
toStr | 转换为字符串 |
toStrArray | 转换为指定类型数组 |
unicodeToStr | unicode的String转换成String的字符串 |
unWrap | 包装类转为原始类,非包装类返回原类 |
wrap | 原始类转为包装类,非原始类返回原类 |
三、基本示例
3.1 Java常见类型转换
3.1.1 基本类型转换
Convert 类支持将字符串转换为各种基本类型,如int、long、double等。不仅如此,它还支持将对象转换为这些基本类型,避免了手动拆箱的麻烦。
java
@Test
public void toStrTest() {
Console.log(Convert.toStr(1));
long[] b = {1, 2, 3, 4, 5};
Console.print(Convert.toStr(b));
// 字符串转int
int num = Convert.toInt("1024");
// 字符串转long
long longNum = Convert.toLong("1024");
// 字符串转double
double doubleNum = Convert.toDouble("1024");
}
3.1.2 转换为指定类型数组
Convert 类提供了 toxxxArray 方法,可以轻松的将一种数据类型的数组转换为其他类型的数组。
java
@Test
public void toIntArrayTest() {
String[] b = {"1", "2", "3", "4"};
Integer[] intArray = Convert.toIntArray(b);
long[] c = {1, 2, 3, 4, 5};
Integer[] intArray2 = Convert.toIntArray(c);
}
3.1.3 转换为日期对象
日期和字符串之间的转换是开发中的常见需求。Convert 类提供了简单的方法来实现这一功能。
java
@Test
public void toDateTest() {
String a = "2022-11-09";
Date value = Convert.toDate(a);
Console.log(Convert.toDate(a));
}
3.1.4 集合与数组转换
Convert 类还支持集合与数组之间的转换,方便在不同数据结构之间进行切换。
java
@Test
public void toListTest() {
Object[] a = {"a", "你", "好", "", 1};
List<?> list = Convert.convert(List.class, a);
// 从4.1.11开始可以这么用
List<?> list2 = Convert.toList(a);
}
3.2 编码转换
在接收表单的时候,我们常常被中文乱码所困扰,其实大多数原因是使用了不正确的编码方式解码了数据。于是 Convert.convertCharset
方法便派上用场了,它可以把乱码转为正确的编码方式:
java
@Test
public void convertCharsetTest() {
String a = "我不是乱码";
// 转换后result为乱码
String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
String raw = Convert.convertCharset(result, CharsetUtil.ISO_8859_1, "UTF-8");
Assert.assertEquals(raw, a);
}
3.3 时间单位转换
Convert.convertTime 方法主要用于转换时长单位,比如一个很大的毫秒,我想获得这个毫秒数对应多少分:
java
@Test
public void convertTimeTest() {
long a = 4535345;
// 结果为:75
long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
Console.log(minutes);
}
3.4 金额大小写转换
java
@Test
public void digitToChineseTest() {
double a = 67556.32;
Console.log(Convert.digitToChinese(a));
}
注意:转换为大写只能精确到小数点儿后两位,之后的数字会被忽略。
3.5 数字转换
Convert 类还支持常见的数字转换操作。例如:数字转英文、数字简化、数字转中文、中文转数字等等。
3.5.1 数字转为英文
java
@Test
public void numberToWordTest() {
Console.print(Convert.numberToWord(100.23));
}
3.6.2 数字简化
java
@Test
public void numberToSimpleTest() {
Console.log(Convert.numberToSimple(1234567));
}
注意:转换为大写只能精确到小数点儿后两位,之后的数字会被忽略。
3.5.3 数字转中文
java
@Test
public void numberToChineseTest() {
// 一万零八百八十九点七二
String f1 = Convert.numberToChinese(10889.72356, false);
System.out.println(f1);
// 使用金额大写
String f2 = Convert.numberToChinese(12653, true);
System.out.println(f2);
}
注意:转换为大写只能精确到小数点儿后两位,之后的数字会被忽略。
3.6 其它类型转换
3.6.1 原始类和包装类转换
有的时候,我们需要将包装类和原始类相互转换(比如Integer.class 和 int.class),这时候我们可以:
java
//去包装
Class<?> wrapClass = Integer.class;
//结果为:int.class
Class<?> unWraped = Convert.unWrap(wrapClass);
//包装
Class<?> primitiveClass = long.class;
//结果为:Long.class
Class<?> wraped = Convert.wrap(primitiveClass);
3.6.2 半角和全角转换
在很多文本的统一化中这两个方法非常有用,主要对标点符号的全角半角转换。
-
半角转全角
javaString a = "123456789"; //结果为:"123456789" String sbc = Convert.toSBC(a);
-
全角转半角
javaString a = "123456789"; //结果为"123456789" String dbc = Convert.toDBC(a);
四、总结
Hutool 的 Convert 类是一个非常强大的工具类,能够极大地简化 Java 开发中的类型转换操作。无论是基本类型、日期、集合,还是复杂对象,Convert 类都能轻松应对。如果你还在为类型转换而烦恼,不妨试试 Hutool 的 Convert 类,相信它会成为你开发中的得力助手!
Hotool 不仅仅只有这一种工具类,还包含了其他许多工具类。在这里我作为一名Hutool的用户,我感谢Hutool的创作者和维护者们为我们带来如此强大便捷的工具库,希望Hutool功能越来越完善,为我们的开发工作带来更多的便利。同时也祝愿所有开发者没有BUG困扰,能够愉快地编写出高效、功能完善的程序。
