zoukankan      html  css  js  c++  java
  • 自定义的字段实现排序

    通过反射实现

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Date;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import static javax.management.openmbean.SimpleType.DATE;
    import static javax.management.openmbean.SimpleType.STRING;
    
    /**
     * @author yan.kang
     * @version 1.0
     * @date 2019-07-11 15:42
     */
    public class ResponseSorter {
    
        private static Pattern linePattern = Pattern.compile("_(\w)");
    
        /**
         * 下划线转驼峰
         * @param str
         * @return
         */
        public static String lineToHump(String str) {
            str = str.toLowerCase();
            Matcher matcher = linePattern.matcher(str);
            StringBuffer sb = new StringBuffer();
            while (matcher.find()) {
                matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
            }
            matcher.appendTail(sb);
            return sb.toString();
        }
    
        /**
         * 对象排序器
         * @param targetList
         * @param sortField 给出排序的字段
         * @param sortMode  出给升序 or 降序,默认升序。
         * @param <T>
         */
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public <T> void sort(List<T> targetList, final String sortField, final String sortMode) {
            Collections.sort(targetList, new Comparator() {
                //匿名内部类,重写compare方法
                @Override
                public int compare(Object obj1, Object obj2) {
                    Class c = obj1.getClass();
                    Integer result = 0;
                    try {
                        Field field = c.getDeclaredField(sortField);
                        String classType = field.getType().getTypeName();
                        Method method = c.getMethod("get" + sortField.substring(0, 1).toUpperCase() + sortField.substring(1), new Class[]{});
                        if (STRING.getTypeName().equals(classType)) {
                            result = ((String) method.invoke(obj1)).compareTo((String) method.invoke(obj2));
                        } else if (DATE.getTypeName().equals(classType)) {
                            Long l = ((Date)method.invoke(obj1)).getTime() - ((Date)method.invoke(obj2)).getTime();
                            result = l > 0 ? 1 : l < 0 ? -1 : 0;
                        } else {
                            result = -100;
                            throw new RuntimeException("暂不支持其它类型字段排序,如有需要请自己添加.");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    result = result > 0 ? 1 : result < 0 ? -1 : 0;
                    // 默认asc,如果逆序结果取反
                    if (Constant.DESC.equalsIgnoreCase(sortMode)) {
                        result = -result;
                    }
                    return result;
                }
            });
            System.out.println(targetList);
        }
    }
    
  • 相关阅读:
    Serverless
    Kubernetes
    下一代微服务-ServiceMesh
    SOA服务治理
    微服务架构
    RPC之Thrift
    【MySQL】MySQL高可用架构之MHA
    远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
    Redis与Memcached的区别
    LVS简介
  • 原文地址:https://www.cnblogs.com/yankang/p/11171710.html
Copyright © 2011-2022 走看看