java List按属性分组工具类

package com.iflytek.bim.dms.common.core.util;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author xghuang
 * @date 2018/6/22
 * @time 13:23
 * @desc:
 */
public class GroupUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(GroupUtil.class);

    /**
     * 将List按照V的methodName方法返回值(返回值必须为K类型)分组,合入到Map>中
* 要保证入参的method必须为V的某一个有返回值的方法,并且该返回值必须为K类型 * * @param list 待分组的列表 * @param map 存放分组后的map * @param clazz 泛型V的类型 * @param methodName 方法名 */ public static void listGroup2Map(List list, Map> map, Class clazz, String methodName) { // 入参非法行校验 if (null == list || null == map || null == clazz || StringUtils.isBlank(methodName)) { LOGGER.error("CommonUtils.listGroup2Map 入参错误,list:" + list + " ;map:" + map + " ;clazz:" + clazz + " ;methodName:" + methodName); return; } // 获取方法 Method method = getMethodByName(clazz, methodName); // 非空判断 if (null == method) { return; } // 正式分组 listGroup2Map(list, map, method); } /** * 将List按照V的某个方法返回值(返回值必须为K类型)分组,合入到Map>中
* 要保证入参的method必须为V的某一个有返回值的方法,并且该返回值必须为K类型 * * @param list 待分组的列表 * @param map 存放分组后的map * @param method 方法 */ @SuppressWarnings("unchecked") private static void listGroup2Map(List list, Map> map, Method method) { // 入参非法行校验 if (null == list || null == map || null == method) { LOGGER.error("CommonUtils.listGroup2Map 入参错误,list:" + list + " ;map:" + map + " ;method:" + method); return; } try { // 开始分组 Object key; List listTmp; for (V val : list) { key = method.invoke(val); listTmp = map.get(key); if (null == listTmp) { listTmp = new ArrayList(); map.put((K) key, listTmp); } listTmp.add(val); } } catch (Exception e) { LOGGER.error("分组失败!", e); } } /** * 根据类和方法名,获取方法对象 * * @param clazz * @param methodName * @return */ private static Method getMethodByName(Class clazz, String methodName) { Method method = null; // 入参不能为空 if (null == clazz || StringUtils.isBlank(methodName)) { LOGGER.error("CommonUtils.getMethodByName 入参错误,clazz:" + clazz + " ;methodName:" + methodName); return method; } try { method = clazz.getDeclaredMethod(methodName); } catch (Exception e) { LOGGER.error("类获取方法失败!", e); } return method; } }

你可能感兴趣的:(java工具)