大家好,欢迎来到IT知识分享网。
👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主
⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 初级进阶地址: ✅ Java 初级进阶路线
🙉 八股文专题:剑指大厂,手撕 Java 八股文
文章目录
✨ 1. 类型转换工具类-Convert 解决我们什么问题
在Java开发中我们要面对各种各样的类型转换问题,尤其是从命令行获取的用户参数、从HttpRequest获取的Parameter等等,这些参数类型多种多样,我们怎么去转换他们呢?常用的办法是先整成String,然后调用XXX.parseXXX方法,还要承受转换失败的风险,不得不加一层try catch,这个小小的过程混迹在业务代码中会显得非常难看和臃肿。
✨ 2. 什么是 Convert 类
Convert类可以说是一个工具方法类,里面封装了针对Java常见类型的转换,用于简化类型转换。Convert类中大部分方法为toXXX,参数为Object,可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值。
✨ 3. Java常见类型转换
- 转换为字符串:
int a = 1; //aStr为"1" String aStr = Convert.toStr(a); long[] b = {
1,2,3,4,5}; //bStr为:"[1, 2, 3, 4, 5]" String bStr = Convert.toStr(b);
- 转换为指定类型数组:
String[] b = {
"1", "2", "3", "4" }; //结果为Integer数组 Integer[] intArray = Convert.toIntArray(b); long[] c = {
1,2,3,4,5}; //结果为Integer数组 Integer[] intArray2 = Convert.toIntArray(c);
- 转换为日期对象:
String a = "2017-05-06"; Date value = Convert.toDate(a);
- 转换为集合:
Object[] a = {
"a", "你", "好", "", 1}; List<?> list = Convert.convert(List.class, a); //从4.1.11开始可以这么用 List<?> list = Convert.toList(a);
✨ 4. 其它类型转换
- 标准类型
通过Convert.convert(Class, Object)方法可以将任意类型转换为指定类型,Hutool中预定义了许多类型转换,例如转换为URI、URL、Calendar等等,这些类型的转换都依托于ConverterRegistry类。通过这个类和Converter接口,我们可以自定义一些类型转换。
首先,我们需要创建一个自定义的类型转换器。假设我们想要将一个字符串转换为Person对象。首先,我们需要创建一个Person类,它具有name和age属性。
public class Person {
private String name; private int age; // 构造函数和getter/setter方法省略 }
接下来,我们创建一个实现Converter接口的自定义转换器:
public class StringToPersonConverter implements Converter<Person> {
@Override public Person convert(Object value, Person defaultValue) throws IllegalArgumentException {
if (value instanceof String) {
String[] parts = ((String) value).split(","); if (parts.length == 2) {
String name = parts[0].trim(); int age = Integer.parseInt(parts[1].trim()); return new Person(name, age); } } return defaultValue; } }
在上面的示例中,我们将字符串按逗号分隔,并将第一个部分作为name属性,第二个部分作为age属性。如果转换失败,将返回defaultValue。
现在,我们可以使用ConverterRegistry类注册我们的自定义转换器。例如,我们将字符串转换为Person对象的转换器注册为默认转换器:
ConverterRegistry.getInstance().putCustom(Person.class, StringToPersonConverter.class);
现在,我们可以使用Convert.convert方法将字符串转换为Person对象:
String input = "John, 25"; Person person = Convert.convert(Person.class, input); System.out.println(person.getName()); // 输出:John System.out.println(person.getAge()); // 输出:25
上面示例演示了如何使用Hutool中的ConverterRegistry类和Converter接口进行自定义类型转换。您可以根据自己的需求创建自定义转换器,并注册到ConverterRegistry中,以实现各种类型的转换。
- 泛型类型
通过convert(TypeReference reference, Object value)方法,自行new一个TypeReference对象可以对嵌套泛型进行类型转换。例如,我们想转换一个对象为List类型,此时传入的标准Class就无法满足要求,此时我们可以这样:
Object[] a = {
"a", "你", "好", "", 1 }; List<String> list = Convert.convert(new TypeReference<List<String>>() {
}, a);
通过TypeReference实例化后制定泛型类型,即可转换对象为我们想要的目标类型。
✨ 5. 半角和全角转换
在很多文本的统一化中这两个方法非常有用,主要对标点符号的全角半角转换。
半角转全角:
String a = ""; //结果为:"123456789" String sbc = Convert.toSBC(a);
全角转半角:
String a = "123456789"; //结果为"" String dbc = Convert.toDBC(a);
✨ 6. 16进制(Hex)
在很多加密解密,以及中文字符串传输(比如表单提交)的时候,会用到16进制转换,就是Hex转换,为此Hutool中专门封装了HexUtil工具类,考虑到16进制转换也是转换的一部分,因此将其方法也放在Convert类中,便于理解和查找,使用同样非常简单:
- 转为16进制(Hex)字符串
使用Hutool中的HexUtil.encodeHexStr
方法将字符串转换为16进制字符串,示例代码如下:
String str = "Hello World"; String hexStr = Convert.Convert(str.getBytes()); System.out.println(hexStr);
输出结果为:
48656C6C6F20576F726C64
- 将16进制(Hex)字符串转为普通字符串:
String hex = "e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2"; //结果为:"我是一个小小的可爱的字符串" String raw = Convert.hexStrToStr(hex, CharsetUtil.CHARSET_UTF_8); //注意:在4.1.11之后hexStrToStr将改名为hexToStr String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);
因为字符串牵涉到编码问题,因此必须传入编码对象,此处使用UTF-8编码。 toHex方法同样支持传入byte[],同样也可以使用hexToBytes方法将16进制转为byte[]。
✨ 7. Unicode和字符串转换
与16进制类似,Convert类同样可以在字符串和Unicode之间轻松转换:
Hutool提供了一些方便的方法来进行Unicode和字符串之间的转换。下面是一些示例:
- 将字符串转换为Unicode编码:
String str = "Hello, 世界!"; String unicode = Convert.strToUnicode(str); System.out.println(unicode); // 输出:\u0048\u0065\u006c\u006c\u006f\u002c\u0020\u4e16\u754c\u0021
- 将Unicode编码转换为字符串:
String unicode = "\\u0048\\u0065\\u006c\\u006c\\u006f\\u002c\\u0020\\u4e16\\u754c\\u0021"; String str = Convert.unicodeToStr(unicode); System.out.println(str); // 输出:Hello, 世界!
- 将包含Unicode编码的字符串转换为正常字符串:
String str = "Hello, \\u4e16\\u754c!"; String result = Convert.unicodeToStr(str); System.out.println(result); // 输出:Hello, 世界!
✨ 8. 编码转换
String garbled = "æˆ‘æ˜¯ä¸æ–‡ä¹±ç "; String correct = Convert.convertCharset(garbled, CharsetUtil.ISO_8859_1, CharsetUtil.UTF_8); System.out.println(correct); // 输出:我是中文乱码
在上面的示例中,我们将一个包含乱码的字符串使用convertCharset方法进行转换。我们指定了原始编码为ISO-8859-1,目标编码为UTF-8。输出的结果是正确的中文字符串。
✨ 9. 时间单位转换
Convert.convertTime方法用于将时间单位进行转换,例如将毫秒转换为分钟。以下是一个示例:
long milliseconds = ; // 10分钟对应的毫秒数 long minutes = Convert.convertTime(milliseconds, TimeUnit.MILLISECONDS, TimeUnit.MINUTES); System.out.println(minutes); // 输出:10
在上面的示例中,我们将毫秒数转换为分钟数。我们指定了原始单位为毫秒(TimeUnit.MILLISECONDS),目标单位为分钟(TimeUnit.MINUTES)。输出的结果是10,表示毫秒对应的分钟数为10。
✨ 10. 金额大小写转换
在Hutool中,Convert.digitToChinese方法可以将金钱数转换为大写形式。以下是一个示例:
double amount = .78; String chineseAmount = Convert.digitToChinese(amount); System.out.println(chineseAmount); // 输出:壹拾贰万叁仟肆佰伍拾陆元柒角捌分
在上面的示例中,我们将金额.78使用Convert.digitToChinese方法转换为大写形式的中文金额。输出的结果是”壹拾贰万叁仟肆佰伍拾陆元柒角捌分”。
Convert.digitToChinese方法支持的金额范围是正负999兆以下的小数。如果超出这个范围,将会返回空字符串。
请注意,以上示例是使用简体中文进行演示。如果需要使用其他语言的大写金额转换,可以使用Convert.digitToChinese方法的重载版本,传入对应的语言参数。例如,使用繁体中文进行转换:
double amount = .78; String chineseAmount = Convert.digitToChinese(amount, Convert.Language.TRADITIONAL_CHINESE); System.out.println(chineseAmount); // 输出:壹拾貳萬參仟肆佰伍拾陸元柒角捌分
✨ 11. 数字转换
- 数字转为英文表达
使用英文进行转换:
import cn.hutool.core.util.NumberUtil; import java.util.Locale; public class NumberConversionExample {
public static void main(String[] args) {
int number = 12345; String f1 = Convert.numberToWord(number); System.out.println(f1); // Output: twelve thousand three hundred forty-five } }
- 数字简化
// 1.2k String format1 = Convert.numberToSimple(1200, false);
- 数字转中文
在Hutool中,将数字转换为英文表达的默认语言是简体中文。以下是一个示例:
import cn.hutool.core.util.NumberUtil; public class NumberConversionExample {
public static void main(String[] args) {
int number = 12345; String f1 = Convert.numberToChinese(number, false); System.out.println(f1); // 输出:一万二千三百四十五 String f2 = Convert.numberToChinese(12653, true); // 使用金额大写: 壹万贰仟陆佰伍拾叁 } }
在上面的示例中,我们使用Hutool的 NumberUtil.toWord
方法将数字12345转换为英文表达。输出的结果是”一万二千三百四十五”。
- 数字中文表示转换为数字
在Hutool中,可以使用 NumberUtil.chineseToNumber
方法将中文表示的数字转换为实际数字。以下是一个示例:
import cn.hutool.core.util.NumberUtil; public class NumberConversionExample {
public static void main(String[] args) {
String chineseNumber = "一千二百三十四"; String number = Convert.numberToChinese(chineseNumber); System.out.println(number); // 输出:1234 } }
在上面的示例中,我们使用Hutool的 NumberUtil.chineseToNumber
方法将中文表示的数字”一千二百三十四”转换为实际数字1234。
✨ 12. 原始类和包装类转换
有的时候,我们需要将包装类和原始类相互转换(比如Integer.class 和 int.class),这时候我们可以:
//去包装 Class<?> wrapClass = Integer.class; //结果为:int.class Class<?> unWraped = Convert.unWrap(wrapClass); //包装 Class<?> primitiveClass = long.class; //结果为:Long.class Class<?> wraped = Convert.wrap(primitiveClass);
以下是使用的Convert.unWrap和Convert.wrap方法进行包装和解包装的示例:
import cn.hutool.core.convert.Convert; public class WrapperConversionExample {
public static void main(String[] args) {
// 解包装 Class<?> wrapClass = Integer.class; Class<?> unWrapped = Convert.unWrap(wrapClass); System.out.println(unWrapped); // 输出:int.class // 包装 Class<?> primitiveClass = long.class; Class<?> wrapped = Convert.wrap(primitiveClass); System.out.println(wrapped); // 输出:java.lang.Long.class } }
在上面的示例中,我们首先使用Convert.unWrap方法将Integer类解包装为int类型。输出的结果是int.class。
然后,我们使用Convert.wrap方法将long类型包装为Long类。输出的结果是java.lang.Long.class。
这些方法可以方便地进行包装和解包装操作,使得在不同类型之间进行转换更加灵活。
精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/155592.html