JAVA小菜鸟排坑系列

一些包装数据的工具类

2018-01-10  本文已影响23人  汗菜

DataTransformUtil.java

利用java反射写的一些包装数据的方法
/**
 * @author ChenJunLin
 * @desciption 处理数据结果集的工具类
 * @create 2018-01-09 10:29
 **/
public class DataTransformUtil {

   /** 默认的用户头像 */
    public static final String DEAULT_ACCOUNT_IMG = "/image/default_avatar.png";

    /**
     * @Author: ChenJunLin
     * @Desciption: 设置集合中头像字段的默认值和前缀路径
     *              clss: 集合泛型的类
     *              list: 需要操作的集合
     *              properties: 头像字段
     *              prefixUrl: 前缀路径
     *              defaulUrl: 默认头像路径
     *              baseUrl: 项目根路径
     * @Date: 10:30 2018/1/9
     * @param:
     */
    public static void setImageFromList (Class clss, List list, String properties, String prefixUrl, String defaulUrl, String baseUrl){

        try {

            if(StringUtils.isEmpty(defaulUrl)){
                defaulUrl = baseUrl + DEAULT_ACCOUNT_IMG;
            }

            Method getImage = getGetterMethod(clss, properties);
            Method setImage = getSetterMethod(clss, properties, String.class);

            for (Object t : list){
                Object image = getImage.invoke(t);
                if(null ==image || StringUtils.isEmpty(image.toString())){
                    setImage.invoke(t,defaulUrl);
                }else {
                    String img = image.toString();
                    if(img.startsWith("/")){
                        setImage.invoke(t, prefixUrl+img);
                    }else {
                        setImage.invoke(t, prefixUrl+"/"+img);
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * @Author: ChenJunLin
     * @Desciption: 设置集合中头像字段的默认值和前缀路径  (List<Map>使用)
     *              list: 需要操作的集合
     *              properties: 头像字段
     *              prefixUrl: 前缀路径
     *              defaulUrl: 默认头像路径
     *              baseUrl: 项目根路径
     * @Date: 17:38 2018/1/19
     * @param:
     */
    public static void setImageFromList (List list, String properties, String prefixUrl, String defaulUrl, String baseUrl){

        try {

            if(StringUtils.isEmpty(defaulUrl)){
                defaulUrl = baseUrl + DEAULT_ACCOUNT_IMG;
            }

            Class mapClass = Map.class;
            Method[] methods = mapClass.getDeclaredMethods();
            Method getImage = mapClass.getDeclaredMethod("get",Object.class);
            Method setImage = mapClass.getDeclaredMethod("put",Object.class,Object.class);

            for (Object t : list){
                Object image = getImage.invoke(t, properties);
                if(null ==image || StringUtils.isEmpty(image.toString())){
                    setImage.invoke(t,properties,defaulUrl);
                }else {
                    String img = image.toString();
                    if(img.startsWith("/")){
                        setImage.invoke(t, properties, prefixUrl+img);
                    }else {
                        setImage.invoke(t, properties, prefixUrl+"/"+img);
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    /**
     * @Author: ChenJunLin
     * @Desciption: 将list集合封装为以某字段为key,list集合为value的map
     *              如:list为整个学校每个班的学生分数情况,现在需要以年级为单位返回学生分数情况
     *              clss: 集合泛型的类型
     *              list: 集合
     *              properties: 需要作为key的属性
     * @Date: 9:56 2018/1/10
     * @param:
     */
    public static Map<Object,List> ListToMapList (Class clss, List list, String properties){

        try {

            Method getMethod = getGetterMethod(clss, properties);

            Map<Object, List> r = new LinkedHashMap<>();

            for(Object o : list){

                Object key = getMethod.invoke(o);

                if(!r.containsKey(key)){
                    r.put(key,new ArrayList<>());
                }

                r.get(key).add(o);
            }

            return r;

        }catch (Exception e){
            e.printStackTrace();
        }

        return null;
    }


    /**
     * @Author: ChenJunLin
     * @Desciption: 从list中分离某一字段的list,并去重
     *              clss: 集合泛型的类型
     *              list: 集合
     *              properties: 需要作为key的属性
     * @Date: 10:01 2018/1/10
     * @param:
     */
    public static List keyListFromList(Class clss, List list, String properties){

        Method getterMethod = getGetterMethod(clss, properties);
        Set<Object> set = new HashSet<>();

        try {
            for(Object o : list){
                Object val = getterMethod.invoke(o);
                set.add(val);
            }
            return new ArrayList(set);
        }catch (Exception e){

        }
        return list;
    }


    /**
     * @Author: ChenJunLin
     * @Desciption: 首字母大写
     * @Date: 9:48 2018/1/10
     * @param:
     */
    public static String captain (String s){
        char[] chars = s.toCharArray();
        chars[0] -= 32;
        s = String.valueOf(chars);
        return s;
    }

    /**
     * @Author: ChenJunLin
     * @Desciption: 获取get方法
     * @Date: 10:05 2018/1/10
     * @param:
     */
    public static Method getGetterMethod(Class clss, String properties){

        try {

            properties = captain(properties);
            String get = "get"+properties;
            Method getMethod = clss.getDeclaredMethod(get);
            return getMethod;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }


    /**
     * @Author: ChenJunLin
     * @Desciption: 获取get方法
     * @Date: 10:05 2018/1/10
     * @param:
     */
    public static Method getSetterMethod(Class clss, String properties, Class propertiesType){

        try {

            properties = captain(properties);
            String set = "set"+properties;
            Method setMethod = clss.getDeclaredMethod(set,propertiesType);
            return setMethod;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

后续还会陆续补充.........
更新时间记录: 2018/1/10
2018/1/23 添加 setImageFromList 的重载方法 支持List<Map>类型的图片路径设置
2018/2/1 setImageFromList Map类型方法修改 set方法调用参数

上一篇下一篇

猜你喜欢

热点阅读