【Java 工具类 Hutool】类型转换工具类-Convert

【Java 工具类 Hutool】类型转换工具类-Convert在 Java 开发中我们要面对各种各样的类型转换问题 尤其是从命令行获取的用户参数 从 HttpRequest 获取的 Parameter 等等 这些参数类型多种多样 我们怎么去转换他们呢 常用的办法是先整成

大家好,欢迎来到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常见类型转换

  1. 转换为字符串:
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); 
  1. 转换为指定类型数组:
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); 
  1. 转换为日期对象:
String a = "2017-05-06"; Date value = Convert.toDate(a); 
  1. 转换为集合:
Object[] a = { 
   "a", "你", "好", "", 1}; List<?> list = Convert.convert(List.class, a); //从4.1.11开始可以这么用 List<?> list = Convert.toList(a); 

✨ 4. 其它类型转换

  1. 标准类型

通过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中,以实现各种类型的转换。

  1. 泛型类型

通过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类中,便于理解和查找,使用同样非常简单:

  1. 转为16进制(Hex)字符串

使用Hutool中的HexUtil.encodeHexStr方法将字符串转换为16进制字符串,示例代码如下:

String str = "Hello World"; String hexStr = Convert.Convert(str.getBytes()); System.out.println(hexStr); 

输出结果为:

48656C6C6F20576F726C64 
  1. 将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和字符串之间的转换。下面是一些示例:

  1. 将字符串转换为Unicode编码:
String str = "Hello, 世界!"; String unicode = Convert.strToUnicode(str); System.out.println(unicode); // 输出:\u0048\u0065\u006c\u006c\u006f\u002c\u0020\u4e16\u754c\u0021 
  1. 将Unicode编码转换为字符串:
String unicode = "\\u0048\\u0065\\u006c\\u006c\\u006f\\u002c\\u0020\\u4e16\\u754c\\u0021"; String str = Convert.unicodeToStr(unicode); System.out.println(str); // 输出:Hello, 世界! 
  1. 将包含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. 数字转换

  1. 数字转为英文表达

使用英文进行转换:

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. 数字简化
// 1.2k String format1 = Convert.numberToSimple(1200, false); 
  1. 数字转中文
    在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转换为英文表达。输出的结果是”一万二千三百四十五”。

  1. 数字中文表示转换为数字

在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

(0)
上一篇 2025-02-18 15:20
下一篇 2025-02-18 15:25

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信