bean拷贝、转换相关
BeanUtils.copyProperties(Object source, Object target)
将source和target实体类中共有的字段进行复制,spring-beans包下的工具类,底层原理也比较简单 反射判断属性名, 也有可能会遇到坑,例如get set方法名不正确 BeanUtils.copyProperties为null的问题new DefaultMapperFactory.Builder().build().getMapperFacade().map(Object source, Target.class)
与BeanUtils 相比 这个方法可以自定义转换字段名 并且基于javassist技术, beanutils是基于反射的,例如源实体类字段是num 我们需要复制到目标实体的age字段,此外还可以复制 List<?> 方法:
new DefaultMapperFactory.Builder().build().getMapperFacade().mapAsList(Object source, Target.class)
public void mapperFactory() {
DefaultMapperFactory factory = new DefaultMapperFactory.Builder().build();
// Import 实体类里面存在有int num 字段 ; People实体类存在 int age字段
Import it = new Import();
it.setNum(11);
// 需要拷贝不同字段名时的处理
factory.classMap(Import.class,People.class).field("num","age").byDefault().register();
People peopleAfter = factory.getMapperFacade().map(it, People.class);
// 此时 peopleAfter.age == it.num == 11
System.out.println(peopleAfter);
}
需要使用orika-core jar包 , maven依赖如下
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.5.4</version>
</dependency>
- 实体类转map 并忽略空字段
(需要fastjson依赖)
// 实体类
Oper oper = new Oper();
oper.setTestXxx("");
oper.setTestDesc("1");
oper.setGroupId(null);
PropertyFilter filter = (source, name, value) -> {
// 忽略为 null 的字段( String 类型还需要忽略空字符串)
if (null == value || ((value instanceof String) && ((String) value).isEmpty())) {
return false;
}
return true;
};
// 实体类转map
Map params = JSON.parseObject(JSON.toJSONString(oper, filter), Map.class);
配置文件加载相关
Properties prop = PropertiesLoaderUtils.loadAllProperties("yourDirName/xx.properties");
动态加载配置文件,即配置文件加载,可以实时读取到,原理是因为每次classLoader会去重新加载 , 参数为配置文件的相对路径, spring-core包下的工具类ResourceBundle bundle = ResourceBundle.getBundle("xx"); String name = bundle.getString("name");
简洁的代码加载资源路径根目录下的xx.properties配置文件(非动态),例如xx配置中存在某个key为 “name”,想要获取value, 可以使用上述方法,java.util下的类
函数式相关
- ::参数转成String ,双冒号参数优点不言而喻。
/**
* Description: 函数式参数转回String属性名
* date: 2021/06/09 12:05
*
* @param sFunctionField
* @return
* @author qkj
*/
public static <T> String function2Str(SFunction<T, ?> sFunctionField) {
Method writeReplace = null;
try {
// 函数式方法可以直接调用writeReplace
writeReplace = sFunctionField.getClass().getDeclaredMethod("writeReplace");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
writeReplace.setAccessible(true);
String fieldName = "";
try {
// 序列化
Object object = writeReplace.invoke(sFunctionField);
// 反序列化
SerializedLambda serializedLambda = (SerializedLambda) object;
String methodName = serializedLambda.getImplMethodName();
String temp = methodName.substring(3);
fieldName = temp.replaceFirst(temp.substring(0, 1), temp.substring(0, 1).toLowerCase());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return fieldName;
}
java中使用groovy脚本 上述代码不再适用 , groovy版:
/**
* 在groovy里面使用mybatis plus 构造器
* java标准包的lambda方式和groovy有差异
* usage: GroovyShell.parse方式调试得出本方法,不保证其它方式生成的 Script 也能使用; 其它方式需要重新调试具体源代码
* @param function
* @author git: qiuhuanhen csdn: 孟秋与你
*/
public static <T> String function2StrInGroovy(Function<T, ?> function) {
InvocationHandler handler = Proxy.getInvocationHandler(function);
// 从本类、父类中查找方法
Method[] methods = handler.getClass().getMethods();
for (Method method : methods) {
if (Objects.equals("getDelegate",method.getName())) {
// 拿到了getDelegate方法
// 使用反射调用 getDelegate 方法
MethodClosure delegate = null;
try {
delegate = (MethodClosure) method.invoke(handler);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
String methodName = delegate.getMethod();
String temp = methodName.substring(3);
temp = temp.replaceFirst(temp.substring(0, 1), temp.substring(0, 1).toLowerCase());
return temp;
}
}
throw new RuntimeException("can't found method");
}
optional相关
- Optional 类非空处理 jdk8特性 支持对null时的处理,具体可以在博主的主页博客搜optional , 有更详细的介绍
People people = null;
String s = Optional.ofNullable(people)
.map(item -> item.getName())
.orElse("---");
// 得到 “---” 字符串
System.out.println(s);
List<People> list = null;
// 得到一个空list对象 而非null值
List<People> list1 = Optional.ofNullable(list).orElse(new ArrayList<>());