一、概述
需求:自定义一个按需返回的接口,可以传入{返回对象},{自定义返回字段},{对象内返回字段},来返回需要的数据。
//user类:Long id;String name;
User user1 = new User(1L,"唐僧");
JsonUtils.Object2Map(
user1
//这里的m和entity是参数声明,在方法内部m为返回的map,entity为user1。
,(m, entity) -> {
//m.put("test","110"); 为传入的逻辑
m.put("test","110");
}
,User::getName);
-
思路:
- 需要一个R apply(T t)函数,传入对象和调用方法,返回调用方法的值
- 需要一个自定义函数方法 set,可以将数据返回后,自定义数据,这个自定义函数的参数为 map,传入对象T
-
逻辑:
- 新建一个map作为返回对象
- 遍历传入的 调用方法函数,可以获取到调用方法 -->对应字段(getName–>name)
- 根据传入对象 t,调用apply方法,得到对应方法返回值 value
- map.put(name,value),装载对象
- 拿到自定义函数set,如果set !=null,则将 map和t作为参数(这里就将调用的时候map和返回的map联系起来了),调用set(而set方法的逻辑是由调用的时候指定的,所以需要在调用此方法的时候,传入自定义返回值(即传入逻辑))
二、自定义函数接口
package com.cuihq.testdemo.util;
import com.cuihq.testdemo.annotation.CommentTarget;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Optional;
//函数式接口注解
@FunctionalInterface
public interface SFunction<T,R> extends Serializable {
/**
* 函数接口方法,如User对象,利用user获取到其 id,name
* 此种方法可以使用 User::getId
* 其余需要传入 user::getId
* @param t
* @return
*/
R apply(T t);
/**
* 获取SerializedLambda,如果传入User::getId 含有内容
* implClass:接口实现类型 User
* implMethodName:调用方法 getId
* implMethodSignature:方法属性返回值类型
* @return SerializedLambda
* @throws Exception
*/
default SerializedLambda getSerializedLambda() throws Exception {
//writeReplace改了好像会报异常
Method write = this.getClass().getDeclaredMethod("writeReplace");
write.setAccessible(true);
return (SerializedLambda) write.invoke(this)