package ink.wgink.util.map; import ink.wgink.util.date.DateUtil; import ink.wgink.util.string.WStringUtil; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import javax.servlet.http.HttpServletRequest; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.ParseException; import java.util.*; import java.util.Map.Entry; /** * @author wenc * @className hashMap 工具类 * @description hashMap 工具类 * @date 2018年2月2日 下午4:59:38 */ public class HashMapUtil { /** * 请求参数转Map * * @param request * @return */ public static Map requestParamsToMap(HttpServletRequest request) { Enumeration requestNames = request.getParameterNames(); Map params = new HashMap<>(0); while (requestNames.hasMoreElements()) { String name = requestNames.nextElement(); String value = request.getParameter(name); if (value.isEmpty()) { continue; } params.put(name, value); } return params; } /** * 类转Map * * @param object * @return */ public static Map objectToMap(Object object) { Map result = null; if (object instanceof Map) { result = mapObjToMap(object); } else { try { result = beanToMap(object); } catch (Exception e) { e.printStackTrace(); } } return result; } /** * 类转Map * * @param object * @return */ public static Map objectToMapString(Object object) { Map result = null; if (object instanceof Map) { result = mapObjToMapString(object); } else { try { result = beanToMapString(object); } catch (Exception e) { e.printStackTrace(); } } return result; } /** * map转map * * @param object * @return */ private static Map mapObjToMapString(Object object) { Map result = new HashMap<>(0); Map map = (Map) object; for (Entry entry : map.entrySet()) { String key = entry.getKey().toString(); Object value = entry.getValue(); result.put(key, value.toString()); } return result; } /** * map转map * * @param object * @return */ public static Map mapObjToMap(Object object) { Map result = new HashMap<>(0); Map map = (Map) object; for (Entry entry : map.entrySet()) { String key = entry.getKey().toString(); Object value = entry.getValue(); result.put(key, value); } return result; } /** * bean转map * * @param object * @return * @throws Exception */ public static Map beanToMap(Object object) { try { Map result = null; BeanInfo beanInfo = null; beanInfo = Introspector.getBeanInfo(object.getClass()); PropertyDescriptor[] properties = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : properties) { if (null == result) { result = new HashMap<>(0); } Method method = property.getReadMethod(); String name = property.getName(); if ("class".equals(name)) { continue; } result.put(name, method.invoke(object)); } return result; } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) { throw new TypeConversionException(e.getMessage(), e); } } /** * bean转Map * * @param object * @return * @throws Exception */ public static Map beanToMapString(Object object) { try { Map result = null; BeanInfo beanInfo = Introspector.getBeanInfo(object.getClass()); PropertyDescriptor[] properties = beanInfo.getPropertyDescriptors(); for (PropertyDescriptor property : properties) { if (null == result) { result = new HashMap<>(0); } Method method = property.getReadMethod(); String name = property.getName(); if ("class".equals(name)) { continue; } result.put(name, method.invoke(object).toString()); } return result; } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) { throw new TypeConversionException(e.getMessage(), e); } } /** * map转obj,需要map的key和obj的属性对应,要有标准的set方法 * * @param map * @param clazz * @return */ public static T mapToBean(Map map, Class clazz) { try { Field[] fields = clazz.getDeclaredFields(); Object instanceObj = clazz.newInstance(); for (Entry kvs : map.entrySet()) { Object value = kvs.getValue(); if (value == null) { continue; } for (Field field : fields) { field.setAccessible(true); String fieldName = field.getName(); if (StringUtils.equals(fieldName, kvs.getKey())) { Method method = clazz.getMethod("set" + WStringUtil.firstToUpper(fieldName), field.getType()); if (field.getType() == int.class) { method.invoke(instanceObj, Integer.parseInt(value.toString())); } else if (field.getType() == String.class) { method.invoke(instanceObj, value.toString()); } else if (field.getType() == Date.class) { method.invoke(instanceObj, DateUtil.sdfTime.parse(value.toString())); } else if (field.getType() == Double.class) { method.invoke(instanceObj, Double.parseDouble(value.toString())); } else if (field.getType() == Float.class) { method.invoke(instanceObj, Float.parseFloat(value.toString())); } else if (field.getType() == Long.class) { method.invoke(instanceObj, Long.parseLong(value.toString())); } else if (field.getType() == Boolean.class) { method.invoke(instanceObj, Boolean.parseBoolean(value.toString())); } else if (field.getType() == Short.class) { method.invoke(instanceObj, Short.parseShort(value.toString())); } break; } } } return clazz.cast(instanceObj); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException | ParseException e) { e.printStackTrace(); } return null; } /** * map队列转bean队列 * * @param listMap * @param clazz * @param * @return */ public static List mapListToBeanList(List> listMap, Class clazz) { List list = new ArrayList<>(); if (listMap == null || listMap.isEmpty()) { return list; } for (Map map : listMap) { list.add(mapToBean(map, clazz)); } return list; } /** * 冒泡排序 * * @param sortMapList 待排序列表 * @param sortKey 排序Key * @param isAsc 是否正向 * @param isNumber 是否数字 */ public static void bubbleSort(List> sortMapList, String sortKey, boolean isAsc, boolean isNumber) { Map tempMap; Map prevMap; Map nextMap; for (Map map : sortMapList) { for (int i = 0; i < sortMapList.size() - 1; i++) { int nextIndex = i + 1; prevMap = sortMapList.get(i); String prevSortKey = prevMap.get(sortKey) == null ? "" : prevMap.get(sortKey).toString(); nextMap = sortMapList.get(nextIndex); String nextSortKey = nextMap.get(sortKey) == null ? "" : nextMap.get(sortKey).toString(); if (isAsc) { if (isNumber) { if (NumberUtils.toDouble(prevSortKey, 0D) > NumberUtils.toDouble(nextSortKey, 0D)) { tempMap = prevMap; sortMapList.set(i, nextMap); sortMapList.set(nextIndex, tempMap); } } else { if (prevSortKey.compareTo(nextSortKey) > 0) { tempMap = prevMap; sortMapList.set(i, nextMap); sortMapList.set(nextIndex, tempMap); } } } else { if (isNumber) { if (NumberUtils.toDouble(prevSortKey, 0D) < NumberUtils.toDouble(nextSortKey, 0D)) { tempMap = prevMap; sortMapList.set(i, nextMap); sortMapList.set(nextIndex, tempMap); } } else { if (prevSortKey.compareTo(nextSortKey) < 0) { tempMap = prevMap; sortMapList.set(i, nextMap); sortMapList.set(nextIndex, tempMap); } } } } } } /** * 类型转换异常 */ public static class TypeConversionException extends RuntimeException { public TypeConversionException() { } public TypeConversionException(String message) { super(message); } public TypeConversionException(String message, Throwable cause) { super(message, cause); } public TypeConversionException(Throwable cause) { super(cause); } public TypeConversionException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } } }