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

854 阅读8分钟

image

前言

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

image

一、概述

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 文件中添加以下依赖:

<!-- 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,再由子模块决定用到哪些模块,你可以在父模块中加入:

<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>

  然后再在子模块中就可以引入自己需要的模块了:

<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金额大小写转换
hexToBytesHex字符串转换为Byte值
hexToStr将16进制(Hex)字符串转为普通字符串
intToByte
intToBytes
longToBytes
numberToChinese数字中文转换为数字,只保留两位小数
numberToSimple将阿拉伯数字转为精简表示形式
numberToWord数字转为英文表达
shortToBytes
strToUnicodeString的字符串转换成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转换为指定类型数组
unicodeToStrunicode的String转换成String的字符串
unWrap包装类转为原始类,非包装类返回原类
wrap原始类转为包装类,非原始类返回原类

三、基本示例

3.1 Java常见类型转换

3.1.1 基本类型转换

  Convert 类支持将字符串转换为各种基本类型,如int、long、double等。不仅如此,它还支持将对象转换为这些基本类型,避免了手动拆箱的麻烦。

@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 方法,可以轻松的将一种数据类型的数组转换为其他类型的数组。

@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 类提供了简单的方法来实现这一功能。

@Test
public void toDateTest() {
    String a = "2022-11-09";
    Date value = Convert.toDate(a);
    Console.log(Convert.toDate(a));
}

3.1.4 集合与数组转换

  Convert 类还支持集合与数组之间的转换,方便在不同数据结构之间进行切换。

@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 方法便派上用场了,它可以把乱码转为正确的编码方式:

@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 方法主要用于转换时长单位,比如一个很大的毫秒,我想获得这个毫秒数对应多少分:

@Test
public void convertTimeTest() {
    long a = 4535345;

    // 结果为:75
    long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
    Console.log(minutes);
}

3.4 金额大小写转换

@Test
public void digitToChineseTest() {
    double a = 67556.32;
    Console.log(Convert.digitToChinese(a));
}

注意:转换为大写只能精确到小数点儿后两位,之后的数字会被忽略。

3.5 数字转换

  Convert 类还支持常见的数字转换操作。例如:数字转英文、数字简化、数字转中文、中文转数字等等。

3.5.1 数字转为英文

@Test
public void numberToWordTest() {
    Console.print(Convert.numberToWord(100.23));
}

3.6.2 数字简化

@Test
public void numberToSimpleTest() {
    Console.log(Convert.numberToSimple(1234567));
}

注意:转换为大写只能精确到小数点儿后两位,之后的数字会被忽略。

3.5.3 数字转中文

@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),这时候我们可以:

//去包装
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 半角和全角转换

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

  • 半角转全角

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

    String a = "123456789";
    
    //结果为"123456789"
    String dbc = Convert.toDBC(a);
    

四、总结

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

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

image