在前面的 OSGL 工具库之编程艺术系列中我们讲述了
本篇讲述如何使用 OSGL 工具库进行类型转换.
类型转换的 API 使用非常简单:
Y y = $.convert(x).to(Y.class)
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"
// 这里 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
enum Code {
AB, bc, Red;
}
Code code;
code = $.convert("AB").to(Code.class); // Code.AB
code = $.convert("ab").caseInsensitivie().to(Code.class); // Code.AB
int n = $.convert(null).to(int.class); // 0
n = $.convert(null).to
Integer N = $.convert(null).to(Integer.class); // null
n = $.convert(null).defaultTo(5).toInt(); // 5
n = $.convert("2").defaultTo(5).toInt(); // 2
// 例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);
注意, 并没有注册直接的从 Date 到 byte[] 的转换器, OSGL 选择最近转换路径自动转换, 下面的代码的实际转换路径为: Date -> String -> Reader -> InputStream -> byte[]
ba = $.convert(new Date()).to(byte[].class);
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;
}
}
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;
}
}
// 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);
}
}
TypeConverterRegistry.INSTANCE
.register(new MyConverter())
.register(new StringToMyFrom());
String s = "abc";
MyFrom from = new MyFrom(s);
MyTo to = $.convert(from).to(MyTo.class);
// 通过隐式管道转换 String 到 myTo
to = $.convert(s).to(MyTo.class);