hutool 笔记二 类型转换工具 Convert

简介: hutool 笔记二 类型转换工具 Convert

类型转换工具

类型转换工具Convert

Convert类

Convert类可以说是一个工具方法类,里面封装了针对Java常见类型的转换,用于简化类型转换。Convert类中大部分方法为toXXX,参数为Object,可以实现将任意可能的类型转换为指定类型。同时支持第二个参数defaultValue用于在转换失败时返回一个默认值

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

通过Convert.convert(Class<T>, Object)方法可以将任意类型转换为指定类型,Hutool中预定义了许多类型转换,例如转换为URI、URL、Calendar等等,这些类型的转换都依托于ConverterRegistry类。通过这个类和Converter接口.

泛型类型

通过convert(TypeReference<T> reference, Object value)方法,自行new一个TypeReference对象可以对嵌套泛型进行类型转换。例如,我们想转换一个对象为List<String>类型,此时传入的标准Class就无法满足要求,此时我们可以这样:

Object[] a = { "a", "你", "好", "", 1 };
List<String> list = Convert.convert(new TypeReference<List<String>>() {}, a);

通过TypeReference实例化后制定泛型类型,即可转换对象为我们想要的目标类型。

字符串转换
各种类型转为字符串
//        各种类型转字符串
        int a = 1;
    //aStr为"1"
        String aStr = Convert.toStr(a);
        System.out.println(aStr);
        long[] b = {1,2,3,4,5};
    //bStr为:"[1, 2, 3, 4, 5]"
        String bStr = Convert.toStr(b);
        System.out.println(bStr);
        Map<String,Integer> map=new HashMap<>();
        map.put("SDfsd",4);
        map.put("dfgd",676);
        map.put("Sdfssd",4);
        System.out.println(Convert.toStr(map));
半角和全角转换

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

// 半角和全角转换
        // 半角转全角
        String a1= "123456789";
//结果为:"123456789"
        String sbc = Convert.toSBC(a1);
        System.out.println(sbc);
        // 全角转半角
        //结果为"123456789"
        String dbc=Convert.toDBC(sbc);
        System.out.println(dbc);
进制转化

在很多加密解密,以及中文字符串传输(比如表单提交)的时候,会用到16进制转换,就是Hex转换,为此Hutool中专门封装了HexUtil工具类,考虑到16进制转换也是转换的一部分,因此将其方法也放在Convert类中,便于理解和查找,使用同样非常简单:

String a = "我是一个小小可爱的字符串";
    //    字符串转化为十六进制字符串
        String hex = Convert.toHex(a, CharsetUtil.CHARSET_UTF_8);
        //结果:"e68891e698afe4b880e4b8aae5b08fe5b08fe79a84e58fafe788b1e79a84e5ad97e7aca6e4b8b2"
        System.out.println(hex);
        // 十六进制字符串转化为正常字符串
        String raw = Convert.hexToStr(hex, CharsetUtil.CHARSET_UTF_8);
//        输出
        System.out.println(raw);

因为字符串牵涉到编码问题,因此必须传入编码对象,此处使用UTF-8编码。 toHex方法同样支持传入byte[],同样也可以使用hexToBytes方法将16进制转为byte[]

不同编码字符串转换

与16进制类似,Convert类同样可以在字符串和Unicode之间轻松转换:

String a = "我是一个小小的可爱的字符串";
        //   字符串转化为unf-8
        //结果为:"\\u6211\\u662f\\u4e00\\u4e2a\\u5c0f\\u5c0f\\u7684\\u53ef\\u7231\\u7684\\u5b57\\u7b26\\u4e32"
        String unicode = Convert.strToUnicode(a);
        System.out.println(unicode);
        String raw = Convert.unicodeToStr(unicode);
    //结果为:"我是一个小小的可爱的字符串"
        System.out.println(raw);
        //utf-8转换为ios-8859-i字符集
        String result = Convert.convertCharset(a, CharsetUtil.UTF_8, CharsetUtil.ISO_8859_1);
        //转换后result为乱码
        System.out.println(result);
        // 把编码转化出来
        String s=Convert.convertCharset(result,CharsetUtil.ISO_8859_1,CharsetUtil.UTF_8);
        System.out.println(s);
时间单位转换

Convert.convertTime方法主要用于转换时长单位,比如一个很大的毫秒,我想获得这个毫秒数对应多少分:

long a = 4535345;
        //结果为:75
        long minutes = Convert.convertTime(a, TimeUnit.MILLISECONDS, TimeUnit.MINUTES);
        System.out.println(minutes);
金额大小写转换

面对财务类需求,Convert.digitToChinese将金钱数转换为大写形式:

double a = 67556.32;
//结果为:"陆万柒仟伍佰伍拾陆元叁角贰分"
        String digitUppercase = Convert.digitToChinese(a);
        System.out.println(digitUppercase);

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

数字转换

数字转换提供多种数字转化为不同字符串的格式

//        数字转为英文表达 ONE HUNDRED AND CENTS TWENTY THREE ONLY
        String format = Convert.numberToWord(100.23);
        System.out.println(format);
//        数字简化  1.2k
        String format1 = Convert.numberToSimple(1200);
        System.out.println(format1);
//        数字转中文 数字转中文方法中,只保留两位小数  一万零八百八十九点七二
        String f1 = Convert.numberToChinese(10889.72356, false);
        System.out.println(f1);
// 使用金额大写  壹万贰仟陆佰伍拾叁
        String f2 = Convert.numberToChinese(12653, true);
        System.out.println(f2);
//        数字中文表示转换为数字 1012
        Integer i= Convert.chineseToNumber("一千零一十二");
        System.out.println(i);
原始类和包装类转换

有的时候,我们需要将包装类和原始类相互转换(比如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);

自定义转换

Hutool的默认转换有时候并不能满足我们自定义对象的一些需求,这时我们可以使用ConverterRegistry.getInstance().putCustom()方法自定义类型转换。

自定义转换器

public static class CustomConverter implements Converter<String>{
    @Override
    public String convert(Object value, String defaultValue) throws IllegalArgumentException {
        return "Custom: " + value.toString();
    }
}

注册转换器

ConverterRegistry converterRegistry = ConverterRegistry.getInstance();
//此处做为示例自定义String转换,因为Hutool中已经提供String转换,请尽量不要替换
//替换可能引发关联转换异常(例如覆盖String转换会影响全局)
converterRegistry.putCustom(String.class, CustomConverter.class);
//执行转换
int a = 454553;
String result = converterRegistry.convert(String.class, a);
Assert.assertEquals("Custom: 454553", result);


相关文章
|
11月前
Hutool工具BeanUtil.copyProperties实现自定义类型转换器之字符串转时间格式化
hutool工具BeanUtil.copyProperties在字符串转LocalDateTime时默认用的格式为yyyy-MM-ddTHH:mm:ss,所以需要自定义转换器才行,在转换时会优先使用自定义的。 在项目启动时执行一次此段代码即可。
257 0
|
8月前
|
Go
Golang 语言极简类型转换库 cast
Golang 语言极简类型转换库 cast
37 0
|
10月前
|
SQL Oracle 关系型数据库
CONVERT 转换函数的简单使用方法
CONVERT 转换函数的简单使用方法
113 0
|
JSON Java 数据格式
Java:Hutool工具箱之hutool-jsonJSON数据读取转换处理
Java:Hutool工具箱之hutool-jsonJSON数据读取转换处理
1161 0
|
安全 Go
Golang:cast安全且易用的类型转换工具
Golang:cast安全且易用的类型转换工具
108 0