原 荐 OSGL 工具库 - 类型转换的艺术

在前面的 OSGL 工具库之编程艺术系列中我们讲述了

本篇讲述如何使用 OSGL 工具库进行类型转换.

类型转换的 API 使用非常简单:

Y y = $.convert(x).to(Y.class)

1. 系统内置类型转换

1.1 基本类型转换示例

String s = "60";
int n = $.convert(s).to(Integer.class); // 60
n = $.convert(s).toInteger(); // 60
n = $.convert(s).toInt(); // 60
s = $.convert(n).toString(); // "60"
s = $.convert(n).to(String.class); // "60"

1.2 hint (转换提示) 的使用

// 这里 hint 的意思是 radix
n = $.convert("FF").hint(16).toInt(); // 255
// 这里 hint  的意思是日期格式
Date date = $.convert("06 Apr 2018").hint("dd MMM yyyy").toDate(); // 2018-04-06
String dateStr = $.convert(date).hint("yyyy-MM-dd").toString(); // 2018-04-06

1.3 Enum 类型转换示例

enum Code {
    AB, bc, Red;
}
Code code; 
code = $.convert("AB").to(Code.class); // Code.AB
code = $.convert("ab").caseInsensitivie().to(Code.class); // Code.AB

1.4 空值的处理

int n = $.convert(null).to(int.class); // 0
n = $.convert(null).to
Integer N = $.convert(null).to(Integer.class); // null

1.4.1 使用默认值

n = $.convert(null).defaultTo(5).toInt(); // 5
n = $.convert("2").defaultTo(5).toInt(); // 2

1.5 通过管道来级联类型转换

// 例1: 不用日期函数来转换日期格式:
// 06/Apr/2018 -> 2018-04-06
s = $.convert("06/Apr/2018")
        .hint("dd/MMM/yyyy")
        .pipeline(Date.class)
        .hint("yyyy-MM-dd")
        .toString(); // 2018-04-06

// 例2: 日期转到byte[]
byte[] ba = $.convert(new Date()).pipeline(String.class).to(byte[].class);

1.5.1 隐式管道

注意, 并没有注册直接的从 Date 到 byte[] 的转换器, OSGL 选择最近转换路径自动转换, 下面的代码的实际转换路径为: Date -> String -> Reader -> InputStream -> byte[]

ba = $.convert(new Date()).to(byte[].class);

2. 向 OSGL 注册并使用自己的类型转换器

2.1 源类型

public class MyFrom {
    public String id;

    public MyFrom(String id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyFrom myFrom = (MyFrom) o;
        return id != null ? id.equals(myFrom.id) : myFrom.id == null;
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
}

2.2 目标类型

public class MyTo {
    public String id;

    public MyTo(String id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyTo MyTo = (MyTo) o;
        return id != null ? id.equals(MyTo.id) : MyTo.id == null;
    }

    @Override
    public int hashCode() {
        return id != null ? id.hashCode() : 0;
    }
}

2.3 转换器

// MyFrom -> MyTo
public class MyConverter extends $.TypeConverter<MyFrom, MyTo> {
    @Override
    public MyTo convert(MyFrom myFrom) {
        return new MyTo(myFrom.id);
    }
}
// String -> MyFrom
public class MyConverter extends $.TypeConverter<String, MyFrom> {
    @Override
    public MyFrom convert(String s) {
        return new MyFrom(s);
    }
}

2.4 注册转换器到 OSGL

TypeConverterRegistry.INSTANCE
    .register(new MyConverter())
    .register(new StringToMyFrom());

2.5 使用自定义转换器

String s = "abc";
MyFrom from = new MyFrom(s);
MyTo to = $.convert(from).to(MyTo.class);

// 通过隐式管道转换 String 到 myTo
to = $.convert(s).to(MyTo.class);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏苦逼的码农

谈谈HashMap、Hashtable和ConcurrenHashMap

今天,我们来谈谈HashMap, Hashtable和ConcurrentHashMap在使用上的一些区别。

1522
来自专栏欧阳大哥的轮子

深入解构iOS系统下的全局对象和初始化函数

事件源于接入了一个第三方库导致应用出现了大量的crash记录,很奇怪的是这么多的crash居然没有收到用户的反馈信息! 在这个过程中每个崩溃栈的信息都明确的指向...

1132
来自专栏大内老A

关于CLR内存管理一些深层次的讨论[下篇]

《上篇》中我们主要讨论的是程序集(Assembly)和应用程序域(AppDomain)的话题,着重介绍了两个不同的程序集加载方式——独占方式和共享方式(中立域方...

1929
来自专栏大数据和云计算技术

MongoDB系列13:MongoDB查询操作符说明

1104
来自专栏Ryan Miao

java并发编程读书笔记(1)-- 对象的共享

1. 一些原则 RIM(Remote Method Invocation):远程方法调用 Race Condition:竞态条件 Servlet要满足多个线程的...

3428
来自专栏Java技术

Java多线程编程-(3)-从一个错误的双重校验锁代码谈一下volatile关键字

在Java多线程编程-(2)中提及到了一段使用Synchronized关键字实现的单利模式--双重校验锁,代码如下:

602
来自专栏Java架构解析

2018最新java面试题(含答案)

基本数据类型包括byte、int、char、long、float、double、boolean和short。

1292
来自专栏钟绍威的专栏

jvm内存区域程序计数器虚拟机栈本地方法栈堆方法区运行时常量池直接内存

概述 jvm内存分为几个区域: 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 这些内存区域是在java进程中细分的,为java程序提供...

1587
来自专栏Android 研究

Java虚拟机基础——2JVM运行时数据区

本篇文章主要讲解JVM运行时数据区,所以我们按照线程是否私有的维度将本篇文章一分为二,分为线程私有数据区和所有线程共有的数据区。而在线程私有的数据区又可以分为程...

845
来自专栏有趣的django

12.Flask-Restful定义Restful的视图 参数认证标准化返回参数

 如果使用Flask-restful,那么定义视图函数的时候,就要继承flask_restful.Resourse类,然后再根据当前请求的method来定义相应...

762

扫码关注云+社区