• java8 排序 orderBy


    OrderByUtils:(待优化)

    package com.icil.report.utils;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Collection;
    import java.util.Comparator;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    import java.util.Optional;
    import java.util.stream.Collectors;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    /**
     * *************************************************************************
     * <PRE>
     * @param <E>
     *  @ClassName:    : ListUtil 
     *
     *  @Description:    : 
     *
     *  @Creation Date   : 13 May 2019 2:48:52 PM
     *
     *  @Author          :  Sea
     *  
     *
     * </PRE>
     **************************************************************************
     */
    @SuppressWarnings("all")
    public class OrderByUtils{
        
        private static Logger  LOGGER=LoggerFactory.getLogger(OrderByUtils.class);
    
      
        //#######################################################################################################
        //                   order by   java 7 && java8
        // ######################################################################################################
        
       
           /**
            * @Desc: java8 parallelStream
            * @param colls :需要排序的集合(pojo)
            * @param firstfiledName  :先按排序的字段
            * @param secondfiledName  ::再按排序的字段
            * @return
            */
    //    public static <E> List<E>  orderby(Collection<E> colls,String firstfiledName,String secondfiledName){
    //     return colls.parallelStream().sorted(Comparator.comparing(d->getFieldStringValueByName(d,firstfiledName)).thenComparing(d->getFieldStringValueByName(d,secondfiledName))).collect(Collectors.toList());
    //   }
        
    
        /**
         *  @Desc: java8 parallelStream
         * @param colls
         * @param filedName 排序的字段
         * @param fieldType  排序的字段的类型
         * @return
         */
        public static <E> List<E>  orderbyPro(Collection<E> colls,String filedName,Class fieldType){
            
            switch (fieldType.getName()) {
              case "java.lang.Integer":
                  return colls.parallelStream().sorted(Comparator.comparing(d->(Integer)getFieldValueByName(d,filedName))).collect(Collectors.toList());
              case "java.lang.Long":
                  return colls.parallelStream().sorted(Comparator.comparing(d->(Long)getFieldValueByName(d,filedName))).collect(Collectors.toList());
              case "java.lang.Double":
                  return colls.parallelStream().sorted(Comparator.comparing(d->(Double)getFieldValueByName(d,filedName))).collect(Collectors.toList());
              case "java.util.Date":
                  return colls.parallelStream().sorted(Comparator.comparing(d->(Date)getFieldValueByName(d,filedName))).collect(Collectors.toList());
              case "java.lang.Float":
                  return colls.parallelStream().sorted(Comparator.comparing(d->(Float)getFieldValueByName(d,filedName))).collect(Collectors.toList());
              case "java.lang.String":
                  return colls.parallelStream().sorted(Comparator.comparing(d->(String)getFieldStringValueByName(d,filedName))).collect(Collectors.toList());  
              default:
                  return null;
            }
       }
        
        
      
        
        
        
        
    
        /**
         * 
         * @param colls
         * @param filedName  :pojo 的属性名  如 user -->name
         * @return
         */
        public static <E> List<E>  orderby(List<E> colls, String filedName,Class fieldType){
            getMyComparator(colls,filedName,fieldType);
             colls.sort(getMyComparator(colls,filedName,fieldType));
             return colls;
        }
       
        
        /**
         * 通过属性名称对集合分组
         * @Desc:java 8 stream api, list 会过滤掉group by filed 的非空字段
         * @param colls   集合必须为对象 eg: List<Employee>
         * @param fieldName为集合中对象的属性名称  eg: Employee-->name
         * @return
         * extends Comparable<T> 
         */
        public static final <D> Map<Object ,List<D>> groupByPro(Collection<D> colls ,String fieldName){
                //filter
    //         List<D> filterlist = colls.parallelStream().filter(r->getFieldValueByName(r,fieldName)!=null).collect(Collectors.toList());
            for (D d : colls) {
                if(OrderByUtils.getFieldValueByName(d, fieldName)==null){
                    OrderByUtils.setFieldValueByName(d, fieldName, "null");
                }
             }
             //group by 
             Map<Object, List<D>> collect = colls.stream().collect(Collectors.groupingBy(r->getFieldValueByName(r,fieldName)));
             return collect;
        }
        
        
        
        
        /** 
         * 根据属性名称获取属性值 
         * */  
       public static Object getFieldValueByName(Object pojo,String fieldName) {  
           try {    
               String firstLetter = fieldName.substring(0, 1).toUpperCase();    
               String getter = "get" + firstLetter + fieldName.substring(1);    
               Method method = pojo.getClass().getMethod(getter, new Class[] {});    
               Object value = method.invoke(pojo, new Object[] {});    
               return value;    
           } catch (Exception e) {    
               LOGGER.error(e.getMessage(),e);    
               return null;    
           }    
       }
       
       
      /**
       *   
       * @param pojo
       * @param fieldName
       * @param value just can be  Integer(int)   Double(double)    Long(ong)  Date  String
       */
      public static void setFieldValueByName(Object pojo,String fieldName,Object value) {  
          try {    
              String firstLetter = fieldName.substring(0, 1).toUpperCase();    
              String seter = "set" + firstLetter + fieldName.substring(1);    
               value = Optional.ofNullable(value).orElseGet(()-> new String("null"));
              String simpleName = value.getClass().getSimpleName();
             Class  class1; 
            switch (simpleName) {
              case "Integer":
                  class1=Integer.class;
                break;
              case "Double":
                  class1=Double.class;
                  break;
              case "Long":
                  class1=Long.class;
                  break;
              case "Date":
                  class1=Date.class;
                  break;
              default:
                  class1=String.class;
                break;
            }
              Method setmethod = pojo.getClass().getMethod(seter, class1);  
              setmethod.invoke(pojo,value);    
                  
          } catch (Exception e) { 
              LOGGER.error(e.getMessage(),e);  
             }    
      } 
       
       
       
       
       /** 
        * 根据属性名称获取属性值 (获取String型)
        * */  
      public static String getFieldStringValueByName(Object o,String fieldName) {  
          try {    
              String firstLetter = fieldName.substring(0, 1).toUpperCase();    
              String getter = "get" + firstLetter + fieldName.substring(1);    
              Method method = o.getClass().getMethod(getter, new Class[] {});    
              String value = (String) method.invoke(o, new Object[] {});    
              return value;    
          } catch (Exception e) {    
              LOGGER.error(e.getMessage(),e);    
              return null;    
          }    
      }
    
       
    
    
       public static  <E> Comparator<E>  getMyComparator(List<E> colls, String filedName,Class fieldType){
                Comparator<E> comparator = new Comparator<E>() {
                    @Override
                    public int compare(E o1, E o2) {
                        
                         int result=0;
                            switch (fieldType.getName()) {
                              case "java.lang.Integer":
                                  result=  getFieldValueByNameAndType(o1,filedName,Integer.class).compareTo(getFieldValueByNameAndType(o2,filedName,Integer.class));
                                break;
                              case "java.lang.Long":
                                  result= getFieldValueByNameAndType(o1,filedName,Long.class).compareTo(getFieldValueByNameAndType(o2,filedName,Long.class));
                                  break;
                              case "java.lang.Double":
                                  result= getFieldValueByNameAndType(o1,filedName,Double.class).compareTo(getFieldValueByNameAndType(o2,filedName,Double.class));
                                  break;
                              case "java.util.Date":
                                  result= getFieldValueByNameAndType(o1,filedName,Date.class).compareTo(getFieldValueByNameAndType(o2,filedName,Date.class));
                                  break;
                              case "java.lang.Float":
                                  result= getFieldValueByNameAndType(o1,filedName,Float.class).compareTo(getFieldValueByNameAndType(o2,filedName,Float.class));
                                  break;
                              case "java.lang.String":
                                  result= getFieldValueByNameAndType(o1,filedName,String.class).compareTo(getFieldValueByNameAndType(o2,filedName,String.class));
                                  break;      
                              default:
                                  result= 0;
                                break;
                            }
                        return  result;
                    }
                };
      return comparator;
    
    }  
       
       /**
        * @param pojo
        * @param fieldName
        * @param fieldType
        * @return
        */
      public static <T> T getFieldValueByNameAndType(Object pojo,String fieldName,Class<T> fieldType) {  
          try {    
              String firstLetter = fieldName.substring(0, 1).toUpperCase();    
              String getter = "get" + firstLetter + fieldName.substring(1);    
              Method method = pojo.getClass().getMethod(getter, new Class[] {});    
              T value = (T) method.invoke(pojo, new Object[] {});    
              return value;    
          } catch (Exception e) {    
              LOGGER.error(e.getMessage(),e);    
              return null;    
          }    
      }
      
      
      /**
       * @param <T>
     * @param pojo
       * @param fieldName
       * @param fieldType
       * @return
       */
      public static <T> T  getFieldValueByNameAndType(Object pojo,String fieldName) {  
          try { 
              
              String firstLetter = fieldName.substring(0, 1).toUpperCase();    
              String getter = "get" + firstLetter + fieldName.substring(1);  
              Field field = pojo.getClass().getDeclaredField(fieldName); // 获取属性
              Class<?> type = field.getType();
              
              Method method = pojo.getClass().getMethod(getter, type);    
               T value = (T) method.invoke(pojo, new Object[] {});    
              return value;    
          } catch (Exception e) {    
              LOGGER.error(e.getMessage(),e);    
              return null;    
          }    
      }
       
       
       
    }

    更多可以参考:http://www.importnew.com/15259.html

    Test :

    package com.icil.report.jdbc;
    
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.List;
    import java.util.stream.Collectors;
    
    import org.junit.Test;
    
    import com.icil.report.pojo.GroupByCourier;
    
    public class OrderByTest {
      
      /**
       * java7 普通排序
       * 多条件组合排序: //先根据NumberOfShipments 排序,然后在更具 Courier 排序
       * 从JDK 8开始,我们现在可以把多个Comparator链在一起(chain together)去建造更复杂的比较逻辑:
       * @throws Exception
       */
      @Test
      public void orderBYtest1() throws Exception {
          ArrayList<GroupByCourier> arrayList = new ArrayList<GroupByCourier>();
    //       GroupByCourier(String courier, Integer numberOfShipments, Integer numberOfSubscriptions)
          arrayList.add(new GroupByCourier("f",2,3));
          arrayList.add(new GroupByCourier("b",10,6));
          arrayList.add(new GroupByCourier("a",4,1));
          arrayList.add(new GroupByCourier("c",15,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",19,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",1,8));
          
       arrayList.sort(Comparator.comparing(GroupByCourier::getNumberOfShipments).thenComparing(GroupByCourier::getCourier));
       //先根据NumberOfShipments 排序,然后在更具 Courier 排序
       Comparator.comparing(GroupByCourier::getNumberOfShipments).thenComparing(GroupByCourier::getCourier);
       arrayList.forEach(r->{System.out.println(r.getCourier() +" -- "+r.getNumberOfShipments()+"--"+r.getNumberOfSubscriptions());});
          
      }
      
      
      /**
       *  java7 并行流式排序
       * 多条件组合排序: //先根据NumberOfShipments 排序,然后在更具 Courier 排序 ,然后在根据 NumberOfSubscriptions 排序
       * 从JDK 8开始,我们现在可以把多个Comparator链在一起(chain together)去建造更复杂的比较逻辑:
       * @throws Exception
       */
      @Test
      public void orderBYtest02() throws Exception {
          ArrayList<GroupByCourier> arrayList = new ArrayList<GroupByCourier>();
    //       GroupByCourier(String courier, Integer numberOfShipments, Integer numberOfSubscriptions)
          arrayList.add(new GroupByCourier("f",2,3));
          arrayList.add(new GroupByCourier("b",10,6));
          arrayList.add(new GroupByCourier("a",4,1));
          arrayList.add(new GroupByCourier("c",15,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",19,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",1,8));
          
          //先根据NumberOfShipments 排序,然后在更具 Courier 排序 ,然后在根据 NumberOfSubscriptions 排序
        //List<GroupByCourier> collect = arrayList.parallelStream().sorted(Comparator.comparing(GroupByCourier::getNumberOfShipments).thenComparing(GroupByCourier::getCourier)).collect(Collectors.toList());
        List<GroupByCourier> collect = arrayList.parallelStream().sorted(Comparator.comparing(GroupByCourier::getNumberOfShipments).thenComparing(GroupByCourier::getCourier).thenComparing(GroupByCourier::getNumberOfSubscriptions)).collect(Collectors.toList());
          
          System.err.println(collect);
          collect.forEach(r->{System.out.println(r.getCourier() +" -- "+r.getNumberOfShipments()+"--"+r.getNumberOfSubscriptions());});
          
      }
      /**
       *  java8 并行流式排序  反转排序
       *  JDK 8同样提供了一个有用的方法用来反转Comparator(reverse Comparator)——我们可以快速地利用它来反转我们的排序
       * 多条件组合排序: //先根据NumberOfShipments 排序,然后在更具 Courier 排序 ,然后在根据 NumberOfSubscriptions 排序
       * 从JDK 8开始,我们现在可以把多个Comparator链在一起(chain together)去建造更复杂的比较逻辑:
       * @throws Exception
       */
      @Test
      public void orderBYtest04() throws Exception {
          ArrayList<GroupByCourier> arrayList = new ArrayList<GroupByCourier>();
    //       GroupByCourier(String courier, Integer numberOfShipments, Integer numberOfSubscriptions)
          arrayList.add(new GroupByCourier("f",2,3));
          arrayList.add(new GroupByCourier("b",10,6));
          arrayList.add(new GroupByCourier("a",4,1));
          arrayList.add(new GroupByCourier("c",15,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",19,8));
          arrayList.add(new GroupByCourier("c",1,8));
          arrayList.add(new GroupByCourier("c",1,8));
          
          //先根据NumberOfShipments 排序,然后在更具 Courier 排序 ,然后在根据 NumberOfSubscriptions 排序 (现在是反过来)
          Comparator<GroupByCourier>  compars = Comparator.comparing(GroupByCourier::getNumberOfShipments).thenComparing(GroupByCourier::getCourier).thenComparing(GroupByCourier::getNumberOfSubscriptions);
          List<GroupByCourier> collect = arrayList.parallelStream().sorted(compars.reversed()).collect(Collectors.toList());
          
          System.err.println(collect);
          collect.forEach(r->{System.out.println(r.getCourier() +" -- "+r.getNumberOfShipments()+"--"+r.getNumberOfSubscriptions());});
      }
      
        
    }
  • 相关阅读:
    Java基础加强--17.利用反射操作泛型VI【泛型类型变量的语义】【GenericDeclaration接口】【泛型接口TypeVariable】【通过Class反射解析泛型类】
    [G]ParameterizedType详解
    java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
    source insight遇到__attribute__解析不到函数
    Exif文件格式描述
    opencv python 匹配
    SQL知识累积
    ant 安装过程中问题记录
    useful-scripts
    excel 经验总结
  • 原文地址:https://www.cnblogs.com/lshan/p/10956495.html
Copyright © 2020-2023  润新知