wg-basic/basic-util/src/main/java/ink/wgink/util/map/HashMapUtil.java
2021-01-28 12:13:15 +08:00

327 lines
11 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<String, Object> requestParamsToMap(HttpServletRequest request) {
Enumeration<String> requestNames = request.getParameterNames();
Map<String, Object> 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<String, Object> objectToMap(Object object) {
Map<String, Object> result = null;
if (object instanceof Map) {
result = mapObjToMap(object);
} else {
try {
result = beanToMap(object);
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
/**
* 类转Map<String,String>
*
* @param object
* @return
*/
public static Map<String, String> objectToMapString(Object object) {
Map<String, String> result = null;
if (object instanceof Map) {
result = mapObjToMapString(object);
} else {
try {
result = beanToMapString(object);
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
/**
* map转map<String, String>
*
* @param object
* @return
*/
private static Map<String, String> mapObjToMapString(Object object) {
Map<String, String> 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<String, Object> mapObjToMap(Object object) {
Map<String, Object> 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<String, Object> beanToMap(Object object) {
try {
Map<String, Object> 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<String, String>
*
* @param object
* @return
* @throws Exception
*/
public static Map<String, String> beanToMapString(Object object) {
try {
Map<String, String> 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> T mapToBean(Map<String, Object> map, Class<T> clazz) {
try {
Field[] fields = clazz.getDeclaredFields();
Object instanceObj = clazz.newInstance();
for (Entry<String, Object> 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 <T>
* @return
*/
public static <T> List<T> mapListToBeanList(List<Map<String, Object>> listMap, Class<T> clazz) {
List<T> list = new ArrayList<>();
if (listMap == null || listMap.isEmpty()) {
return list;
}
for (Map<String, Object> map : listMap) {
list.add(mapToBean(map, clazz));
}
return list;
}
/**
* 冒泡排序
*
* @param sortMapList 待排序列表
* @param sortKey 排序Key
* @param isAsc 是否正向
* @param isNumber 是否数字
*/
public static void bubbleSort(List<Map<String, Object>> sortMapList, String sortKey, boolean isAsc, boolean isNumber) {
Map<String, Object> tempMap;
Map<String, Object> prevMap;
Map<String, Object> nextMap;
for (Map<String, Object> 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);
}
}
}