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;/**
* *************************************************************************
*
* @param
* @ClassName: : ListUtil
*
* @Description: :
*
* @Creation Date : 13 May 2019 2:48:52 PM
*
* @Author : Sea
*
*
*
***************************************************************************/@SuppressWarnings("all")public classOrderByUtils{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 List orderby(Collection 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 List orderbyPro(Collectioncolls,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 List orderby(Listcolls, String filedName,Class fieldType){
getMyComparator(colls,filedName,fieldType);
colls.sort(getMyComparator(colls,filedName,fieldType));returncolls;
}/**
* 通过属性名称对集合分组
* @Desc:java 8 stream api, list 会过滤掉group by filed 的非空字段
* @param colls 集合必须为对象 eg: List
* @param fieldName为集合中对象的属性名称 eg: Employee-->name
* @return
* extends Comparable*/
public static final Map> groupByPro(Collectioncolls ,String fieldName){//filter//List 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> collect = colls.stream().collect(Collectors.groupingBy(r->getFieldValueByName(r,fieldName)));returncollect;
}/**
* 根据属性名称获取属性值
**/
public staticObject 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, newClass[] {});
Object value= method.invoke(pojo, newObject[] {});returnvalue;
}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 voidsetFieldValueByName(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 staticString 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, newClass[] {});
String value= (String) method.invoke(o, newObject[] {});returnvalue;
}catch(Exception e) {
LOGGER.error(e.getMessage(),e);return null;
}
}public static Comparator getMyComparator(Listcolls, String filedName,Class fieldType){
Comparator comparator = new Comparator() {
@Overridepublic intcompare(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;
}returnresult;
}
};returncomparator;
}/**
* @param pojo
* @param fieldName
* @param fieldType
* @return*/
public static T getFieldValueByNameAndType(Object pojo,String fieldName,ClassfieldType) {try{
String firstLetter= fieldName.substring(0, 1).toUpperCase();
String getter= "get" + firstLetter + fieldName.substring(1);
Method method= pojo.getClass().getMethod(getter, newClass[] {});
T value= (T) method.invoke(pojo, newObject[] {});returnvalue;
}catch(Exception e) {
LOGGER.error(e.getMessage(),e);return null;
}
}/**
* @param
* @param pojo
* @param fieldName
* @param fieldType
* @return*/
public static 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, newObject[] {});returnvalue;
}catch(Exception e) {
LOGGER.error(e.getMessage(),e);return null;
}
}
}