# 工具类
# 排名前16的工具类
# org.apache.commons.lang3
# org.springframework.util
# java.util——Collection
# java.util——字符串格式化操作Formatter
| 说明符 | 适用于 | 输出 |
|---|---|---|
| %a | 浮点数 (除了BigDecimal) | 浮点数的十六进制输出 |
| %b | 任何类型 | 如果为非空则为“true”,为空则为“false” |
| %c | 字符 | Unicode字符 |
| %d | 证书(包括byte, short, int, long, bigint) | 十进制整数 |
| %e | 浮点数 | 科学计数的十进制数 |
| %f | 浮点数 | 十进制数 |
| %g | 浮点数 | 十进制数,根据值和精度可能以科学计数法显示 |
| %h | 任何类型 | 通过hashCode()方法输出的16进制数 |
| %n | 无 | 平台相关的换行符 |
| %o | 整数(包括byte, short, int, long, bigint) | 八进制数 |
| %s | 任何类型 | 字符串 |
| %t | 日期/时间 (包含long, Calendar, Date 和TemporalAccessor) | %t是日期/时间转换的前缀。后面还需要跟其他的标识,请参考下面的日期/时间转换。 |
| %x | 整数(包含byte, short, int, long, bigint) | 十六进制字符串 |
# 具体日期和时间格式
注意:使用
“%T”替换下面的“%t”可以将输出结果变成大写形式。
| 标识 | 注释 |
|---|---|
| %tA | 星期几的全名,例如 “Sunday“, “Monday“。 |
| %ta | 星期几的缩写,例如 “Sun“, “Mon“。 |
| %tB | 月份的全名,例如 “January“, “February“。 |
| %tb | 月份的缩写,例如 “Jan“, “Feb“。 |
| %tC | 年的世纪部分的格式为两位数,从 “00“到“99”。 |
| %tc | 日期和时间的格式为 “%ta %tb %td %tT %tZ %tY” 如 “Fri Feb 17 07:45:42 PST 2017“。 |
| %tD | 格式为 “%tm/%td/%ty“ 的日期。 |
| %td | 两位的日期格式,从 “01”到 “31“。 |
| %te | 没有前导0的日期,从 “1” 到 “31”。 |
| %tF | 使用 “%tY-%tm-%td“ 格式的 ISO 8601 日期。 |
| %tH | 24小时制的小时,从 “00” 到 “23“。 |
| %th | 同 %tb。 |
| %tI | 12小时制的小时,从 “01” 到 “12“。 |
| %tj | 带前导0的年中的日期,从 “001” 到“366“。 |
| %tk | 没有前导0的24小时制,从 “0” 到 “23“。 |
| %tl | 没有前导0的12小时制,从 “1” 到“12“。 |
| %tM | 带前导0的分钟,从 “00” 到“59“。 |
| %tm | 带前导0的月份,从 “01” 到 “12“。 |
| %tN | 带前导0的9位纳秒数,从 “000000000” to “999999999”. |
| %tp | 和区域相关的 “am” or “pm” 标记。 |
| %tQ | 1970年1月1日00:00:00 UTC 以来的毫秒。 |
| %tR | 24小时制的时间,如:“%tH:%tM“。 |
| %tr | 2位数字格式的秒,从 “00” 到 “60”。 “60” 需要支持闰秒。 |
| %ts | 1970年1月1日00:00:00 UTC以后的秒数。 |
| %tT | 24小时制的时分秒,如: “%tH:%tM:%tS“。 |
| %tY | 4位的年份格式,从 “0000” 到 “9999“。 |
| %ty | 2位的年份格式,从 “00” 到 “99“。 |
| %tZ | 时区缩写,如:“UTC“, “PST“。 |
| %tz | 与GMT的时区偏移量,如 -0800。 |
# 参数索引
参数索引是以 $结尾,在%后面的数字,用于指定在参数列表中的参数。 参数索引从 1 开始。
String.format("%2$s", 32, "Hello"); // 输出:"Hello"
1
# 格式化整数
使用%d格式说明符,您可以使用所有整数类型的参数,包括byte,short,int,long 和BigInteger。默认格式:
String.format("%d", 93); // 输出:93
1
- 指定宽度:
String.format("%20d", 93); // 输出:| 93|
1
- 指定宽度内的左对齐:
String.format("%-20d", 93); // 输出:|93 |
1
- 用零填充:
String.format("%020d", 93); // 输出:|00000000000000000093|
1
- 用”+”号打印正数(负数总是包含”-“):
String.format("%+20d", 93); // 输出:| +93|
String.format("%+20d", -93); // 输出:| -93|
1
2
2
- 正数之前的空格,按正常值计算负数的“-”。
String.format("% d", 93); // 输出:| 93|
String.format("% d", -36); // 输出:|-36|
1
2
2
- 使用和区域相关的千位分隔符,美国的是“,”:
String.format("%,d", 10000000); // 输出:|10,000,000|
1
- 中国的也一样:
String.format(Locale.CHINA, "%,d", 10000000)// 输出:|10,000,000|
1
- 使用左边括号括起来可以跳过“-”。
String.format("%(d", -36); // 输出:|(36)|
1
- 八进制输出。
String.format("%o"), 93); // 输出:135
1
- 十六进制输出。
String.format("%x", 93); // 输出:5d
1
- 八进制和十六进制输出的替代表示。
带前导0的八进制和带前导”0x“的十六进制输出:
String.format("%#o", 93); // 输出:0135
String.format("%#x", 93); // 输出:0x5d
String.format("%#X", 93); // 输出:0X5D
1
2
3
2
3
# 字符串和字符转换
默认格式。
- 打印整个字符串。
String.format("%s", "Hello World"); // 输出:"Hello World"
1
- 指定字段长度。
String.format("%20s", "Hello World"); // 输出:| Hello World|
1
- 左对齐文本。
String.format("%-20s", "Hello World"); // 输出:|Hello World |
1
- 指定最大字符数。
String.format("%.5s", "Hello World"); // 输出:|Hello|
1
- 指定宽度和最大字符数。
String.format("%20.5s", "Hello World"); // 输出:| Hello|
1
# 再见 BeanUtils对比 12 种 Bean 自动映射工具,就它性能最拉跨
用于对象属性转换
有12种,包括:普通的getset、json2Json、Apache属性拷贝、Spring属性拷贝、bean-mapping、bean-mapping-asm、BeanCopier、Orika、Dozer、ModelMapper、JMapper、MapStruct
BeanUtils.copyProperties
BeanUtils.copyProperties 是大家代码里最常出现的工具类,但只要你不把它用错成 Apache 包下的,而是使用 Spring 提供的,就基本还不会对性能造成多大影响。

# get\set
- 推荐:★★★☆☆
- 性能:★★★★★
- 手段:手写
# json2Json
- 推荐:☆☆☆☆☆
- 性能:★☆☆☆☆
- 手段:把对象转JSON串,再把JSON转另外一个对象
# Apache copyProperties
- 推荐:☆☆☆☆☆
- 性能:★☆☆☆☆
- 手段:Introspector 机制获取到类的属性来进行赋值操作
- 点评:有坑,兼容性交差,不建议使用
# Spring copyProperties
- 推荐:★★★☆☆
- 性能:★★★★☆
- 手段:Introspector机制获取到类的属性来进行赋值操作
- 点评:同样是反射的属性拷贝,Spring 提供的 copyProperties 要比 Apache 好用的多,只要你不用错,基本不会有啥问题。
@Component
public class SpringCopyPropertiesAssembler implements IAssembler<UserVO, UserDTO> {
@Override
public UserDTO sourceToTarget(UserVO var) {
UserDTO userDTO = new UserDTO();
BeanUtils.copyProperties(var, userDTO);
return userDTO;
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# Bean Mapping
- 推荐:★★☆☆☆
- 性能:★★★☆☆
- 手段:属性拷贝
# Bean Mapping ASM
- 推荐:★★★☆☆
- 性能:★★★★☆
- 手段:基于ASM字节码框架实现
- 点评:与普通的 Bean Mapping 相比,性能有所提升,可以使用。
# BeanCopier
@Component
public class BeanCopierAssembler implements IAssembler<UserVO, UserDTO> {
@Override
public UserDTO sourceToTarget(UserVO var) {
UserDTO userDTO = new UserDTO();
BeanCopier beanCopier = BeanCopier.create(var.getClass(), userDTO.getClass(), false);
beanCopier.copy(var, userDTO, null);
return userDTO;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 推荐:★★★☆☆
- 性能:★★★★☆
- 手段:基于CGlib字节码操作生成get、set方法
- 点评:整体性能很不错,使用也不复杂,可以使用
# Orika
# Dozer
# ModelMapper
@Component
public class ModelMapperAssembler implements IAssembler<UserVO, UserDTO> {
private static ModelMapper modelMapper = new ModelMapper();
static {
modelMapper.addMappings(new PropertyMap<UserVO, UserDTO>() {
@Override
protected void configure() {
// 属性值不一样可以自己操作
map().setUserId(source.getUserId());
}
});
}
@Override
public UserDTO sourceToTarget(UserVO var) {
return modelMapper.map(var, UserDTO.class);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 官网:http://modelmapper.org
- 推荐:★★★☆☆
- 性能:★★★☆☆
- 手段:基于ASM字节码实现
- 点评:转换对象数量较少时性能不错,如果同时大批量转换对象,性能有所下降
# JMapper
JMapper<UserDTO, UserVO> jMapper = new JMapper<>(UserDTO.class, UserVO.class, new JMapperAPI()
.add(JMapperAPI.mappedClass(UserDTO.class)
.add(JMapperAPI.attribute("userId")
.value("userId"))
.add(JMapperAPI.attribute("userNickName")
.value("userNickName"))
.add(JMapperAPI.attribute("createTime")
.value("createTime"))
));
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 官网:https://github.com/jmapper-framework/jmapper-core/wiki
- 推荐:★★★★☆
- 性能:★★★★★
- 手段:Elegance, high performance and robustness all in one java bean mapper
- 点评:速度真心可以,不过结合 SpringBoot 感觉有的一点点麻烦,可能姿势不对
# MapStruct
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE)
public interface UserDTOMapping extends IMapping<UserVO, UserDTO> {
/** 用于测试的单例 */
IMapping<UserVO, UserDTO> INSTANCE = Mappers.getMapper(UserDTOMapping.class);
@Mapping(target = "userId", source = "userId")
@Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
@Override
UserDTO sourceToTarget(UserVO var1);
@Mapping(target = "userId", source = "userId")
@Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
@Override
UserVO targetToSource(UserDTO var1);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- 官网:https://github.com/mapstruct/mapstruct
- 推荐:★★★★★
- 性能:★★★★★
- 手段:直接在编译期生成对应的get、set,像手写的代码一样
- 点评:速度很快,不需要到运行期处理,结合到框架中使用方便