Hutool之Convert类:轻松搞定Java类型转换

前言

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 半角和全角转换

在很多文本的统一化中这两个方法非常有用,主要对标点符号的全角半角转换。

  • 半角转全角

    java 复制代码
    String a = "123456789";
    
    //结果为:"123456789"
    String sbc = Convert.toSBC(a);
  • 全角转半角

    java 复制代码
    String a = "123456789";
    
    //结果为"123456789"
    String dbc = Convert.toDBC(a);

四、总结

Hutool 的 Convert 类是一个非常强大的工具类,能够极大地简化 Java 开发中的类型转换操作。无论是基本类型、日期、集合,还是复杂对象,Convert 类都能轻松应对。如果你还在为类型转换而烦恼,不妨试试 Hutool 的 Convert 类,相信它会成为你开发中的得力助手!

Hotool 不仅仅只有这一种工具类,还包含了其他许多工具类。在这里我作为一名Hutool的用户,我感谢Hutool的创作者和维护者们为我们带来如此强大便捷的工具库,希望Hutool功能越来越完善,为我们的开发工作带来更多的便利。同时也祝愿所有开发者没有BUG困扰,能够愉快地编写出高效、功能完善的程序。

相关推荐
java1234_小锋25 分钟前
Spring Bean有哪几种配置方式?
java·后端·spring
柯南二号1 小时前
【后端】SpringBoot用CORS解决无法跨域访问的问题
java·spring boot·后端
每天一个秃顶小技巧2 小时前
02.Golang 切片(slice)源码分析(一、定义与基础操作实现)
开发语言·后端·python·golang
gCode Teacher 格码致知3 小时前
《Asp.net Mvc 网站开发》复习试题
后端·asp.net·mvc
Moshow郑锴5 小时前
Spring Boot 3 + Undertow 服务器优化配置
服务器·spring boot·后端
Chandler246 小时前
Go语言即时通讯系统 开发日志day1
开发语言·后端·golang
有梦想的攻城狮6 小时前
spring中的@Lazy注解详解
java·后端·spring
野犬寒鸦7 小时前
Linux常用命令详解(下):打包压缩、文本编辑与查找命令
linux·运维·服务器·数据库·后端·github
huohuopro7 小时前
thinkphp模板文件缺失没有报错/thinkphp无法正常访问控制器
后端·thinkphp
cainiao08060510 小时前
《Spring Boot 4.0新特性深度解析》
java·spring boot·后端