Java快捷封装Lambda版 Map对象返回

288 阅读3分钟

在写接口时,会发现 有的时候图方便 直接返回整个对象,这样是不妥的 但是如果要返回指定的字段和属性 重新set get太累 便想着直接 使用map 来封装返回对象 但是有个问题 map.put("xxname",obj);字段名还要手打 更累,便想到直接使用函数式接口 走Lambda 表达式更快 就有了本次尝试

函数式接口

/**
 * @Description 支持序列化的 Function
 */
@FunctionalInterface
public interface MapLambdaFunction<T, R>extends Function<T, R>, Serializable {
}

快捷封装类

/**
 *@Description: 简化map封装操作
 */
public class MapLambda<T> {
    //封装对象
    private Map<String, Object> paramMap = new HashMap<>();
    private Map<String,List<Map<String,Object>>> listMap = new HashMap<>();
    /**
     * @Description: 对象添加操作
     * @param: column 字段名称,value 单个属性值
     */
    public void putOne(MapLambdaFunction<T, ?> column, Object value) {
        String fieldName = getFieldName(column);
        paramMap.put(fieldName, value);
    }
    /**
     * @Description: 排除指定字段 exclude
     * @param: value 放入完整 对象信息,column 可变参
     */
    @SafeVarargs
    public final void excludeOne(Object value, MapLambdaFunction<T, ?>... column){
        try {
            int length = column.length;
            if (length > 0){
                //排除重复字段
                Set<String> stringSet = new HashSet<>(length);
                for (MapLambdaFunction<T, ?> tMapLambdaFunction : column) {
                    String item = getFieldName(tMapLambdaFunction);
                    stringSet.add(item);
                }
                //反射截取
                Class<?> aClass = value.getClass();
                Field[] declaredFields = aClass.getDeclaredFields();
                for (Field declaredField : declaredFields) {
                    //设置可读
                    declaredField.setAccessible(true);
                    //排除静态字段
                    if(Modifier.isStatic(declaredField.getModifiers())){
                        continue;
                    }
                    //获取字段名称
                    String name = declaredField.getName();
                    //是否包含
                    boolean contains = stringSet.contains(name);
                    if (!contains){
                        //获取当前字段属性值
                        Object o = declaredField.get(value);
                        paramMap.put(name,o);
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
    //排除list对象中的字段
    /**
     * @param: value-> list 数据源, column 排除字段
     */
    @SafeVarargs
    public final void excludeList(Object value, MapLambdaFunction<T, ?>... column)  {

        try {
            int length = column.length;
            if (length > 0){
                List<Map<String,Object>> maps = new ArrayList<>(length);
                //排除重复字段
                Set<String> stringSet = new HashSet<>(length);
                for (MapLambdaFunction<T, ?> tMapLambdaFunction : column) {
                    String item = getFieldName(tMapLambdaFunction);
                    stringSet.add(item);
                }
                //反射截取
                Class<?> aClass = value.getClass();
                if (!aClass.getName().equals("com.github.pagehelper.Page")){
                    //普通list
                    List<?> listObj = (List<?>) value;
                    for (Object next : listObj) {
                        Map<String,Object> map = new HashMap<>();
                        Class<?> nextClass = next.getClass();
                        Field[] declaredFields = nextClass.getDeclaredFields();
                        for (Field declaredField : declaredFields) {
                            //设置可读
                            declaredField.setAccessible(true);
                            //排除静态字段
                            if(Modifier.isStatic(declaredField.getModifiers())){
                                continue;
                            }
                            //获取字段名称
                            String name = declaredField.getName();
                            //是否包含
                            boolean contains = stringSet.contains(name);
                            if (!contains){
                                //获取当前字段属性值
                                Object o = declaredField.get(next);
                                map.put(name,o);
                            }
                        }
                        maps.add(map);
                    }
                }else {
                    //若为分页插件
                    PropertyDescriptor[] ps = Introspector.getBeanInfo(aClass, Object.class).getPropertyDescriptors();
                    for (PropertyDescriptor prop : ps) {
                        //prop.getPropertyType() == List.class
                        if (prop.getPropertyType().isAssignableFrom(List.class)) { //List 集合类型
                            Object obj = aClass.getMethod(prop.getReadMethod().getName()).invoke(value);
                            if(obj !=null){
                                List<?> listObj = (List<?>) obj;
                                //next list中每一项的 对象值
                                for (Object next : listObj) {
                                    Map<String,Object> map = new HashMap<>();
                                    Class<?> nextClass = next.getClass();
                                    Field[] declaredFields = nextClass.getDeclaredFields();
                                    for (Field declaredField : declaredFields) {
                                        //设置可读
                                        declaredField.setAccessible(true);
                                        //排除静态字段
                                        if(Modifier.isStatic(declaredField.getModifiers())){
                                            continue;
                                        }
                                        //获取字段名称
                                        String name = declaredField.getName();
                                        //是否包含
                                        boolean contains = stringSet.contains(name);
                                        if (!contains){
                                            //获取当前字段属性值
                                            Object o = declaredField.get(next);
                                            map.put(name,o);
                                        }
                                    }
                                    maps.add(map);
                                }
                            }

                        }
                    }
                }

                listMap.put("list",maps);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //获取反射字段名称
    private String getFieldName(MapLambdaFunction<T, ?> column) {
        String fieldName = null;
        try {
            //获取序列化后的对象
            Method writeReplace = column.getClass().getDeclaredMethod("writeReplace");
            writeReplace.setAccessible(true);
            SerializedLambda serializedLambda = (SerializedLambda)writeReplace.invoke(column);
            String getterName = serializedLambda.getImplMethodName();
            //获取字段名称
            fieldName = Introspector.decapitalize(getterName.replace("get", ""));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fieldName;
    }

    //返回结果集
    public Map<String, Object> toMap() {
        return paramMap;
    }
    //返回list
    public List<Map<String, Object>>  toList() {
        List<Map<String, Object>> list = listMap.get("list");
        return  list;
    }
}

测试实体类

public class User implements Serializable {
    private String id;
    private String name;
    private Integer age;
    private Integer sex;
    private String art1;
    private String art2;
    private String art3;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getArt1() {
        return art1;
    }

    public void setArt1(String art1) {
        this.art1 = art1;
    }

    public String getArt2() {
        return art2;
    }

    public void setArt2(String art2) {
        this.art2 = art2;
    }

    public String getArt3() {
        return art3;
    }

    public void setArt3(String art3) {
        this.art3 = art3;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + ''' +
                ", name='" + name + ''' +
                ", age=" + age +
                ", sex=" + sex +
                ", art1='" + art1 + ''' +
                ", art2='" + art2 + ''' +
                ", art3='" + art3 + ''' +
                '}';
    }
}

测试类

public class TestTool {
    public static void main(String[] args) {
        putObjOne();
        excludeObjOne();
        excludeObjList();
    }
    private static void excludeObjList() {
        List<User> userList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId("1"+i);
            user.setName("张三"+i);
            user.setAge(16+i);
            user.setSex(1);
            user.setArt1("1");
            user.setArt2("2");
            user.setArt3("3");
            userList.add(user);
        }
        MapLambda<User> mapLambda = new MapLambda<>();
        //传入数据源,传入排除字段
        mapLambda.excludeList(userList,User::getArt1,User::getArt2,User::getArt3,User::getId);
        //收集为新的list
        List<Map<String, Object>> maps = mapLambda.toList();
        System.out.println("排除对象字段后list:"+maps);
    }

    //排除 对象中字段
    private static void excludeObjOne() {
        MapLambda<User> mapLambda = new MapLambda<>();
        User user = new User();
        user.setId("1");
        user.setName("张三");
        user.setAge(16);
        user.setSex(1);
        user.setArt1("1");
        user.setArt2("2");
        user.setArt3("3");
        mapLambda.excludeOne(user,User::getArt1,User::getArt2,User::getArt3);
        Map<String, Object> objectMap = mapLambda.toMap();
        System.out.println("排除对象字段:"+objectMap);
    }

    //封装新map
    private static void putObjOne() {
        MapLambda<User> mapLambda = new MapLambda<>();
        User user = new User();
        user.setId("1");
        user.setName("张三");
        user.setAge(16);
        user.setSex(1);
        user.setArt1("1");
        user.setArt2("2");
        user.setArt3("3");
        mapLambda.putOne(User::getId,user.getId());
        mapLambda.putOne(User::getName,user.getName());
        Map<String, Object> objectMap = mapLambda.toMap();
        System.out.println("封装新map:"+objectMap);
    }
}

效果展示

image.png