基于反射List转Map的一种通用泛型实现

来源:互联网 发布:淘宝认证账号 编辑:程序博客网 时间:2024/05/21 17:27

写在前面

网上list转map的方式很多,这里仅作为自己学习积累,如有雷同算我抄袭。

需求背景

实际项目中,由于不允许连表查询,往往是从A表查出list1,从B表查出list2,在内存中循环遍历根据某一属性相同,处理一些业务逻辑。当list的数据量大了之后,这种处理方式会比较慢,如果被leader看到这样的代码会被喷的。大家都知道Map因为其独特存储方式(不了解可以去看下hashMap的源码分析,网上很多),从Map里读数据是非常快的,这个时候将list1或者list2中的某一个转成map,再去做比对就快很多。

基于反射的实现

import java.lang.reflect.Method;import java.util.HashMap;import java.util.List;import java.util.Map;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.CollectionUtils;/** * *  * @ClassName ListToMapUtil.java * <p>Description: list转map,属性需要提供getter方法</p> * @author 沉鱼 * @date 2017年12月12日 上午9:33:12 */public class ListToMapUtil {    private static final Logger LOGGER = LoggerFactory            .getLogger(ListToMapUtil.class);    /***      * 方法名 : listToMap     * <p>Description: </p>     * @author 沉鱼     * @date 2017年12月12日 上午9:37:36     * @version 1.0      * @param list  //待转成map的list     * @param fieldMethodName   //作为map的key值的属性的getter方法名     * @param list中实体的Class实例     * @return Map<K,V>     */    @SuppressWarnings("unchecked")    public static <K,V> Map<K,V> listToMap(List<V> list,String fieldMethodName,Class<V> c) {        Map<K,V> map = new HashMap<>();        if (!CollectionUtils.isEmpty(list)) {            try {                Method method = c.getMethod(fieldMethodName);                for (int i = 0; i < list.size(); i++) {                    V v = list.get(i);                    K k = (K)method.invoke(v);                    map.put(k, v);                }            } catch (Exception e) {                LOGGER.info("list转map异常[{}]",e);            }        }        return map;    }}

这个方法的注意点,上面注释写的很清楚,list里的实体类对应的属性要
有getter方法

下面测试

import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSONObject;import tf56.ehuodiWarehouse.util.ListToMapUtil;public class Person {    private String uniqueCode;//唯一码    private Integer salary;    //这个getter方法不能少    public String getUniqueCode() {        return uniqueCode;    }    public void setUniqueCode(String uniqueCode) {        this.uniqueCode = uniqueCode;    }    public Integer getSalary() {        return salary;    }    public void setSalary(Integer salary) {        this.salary = salary;    }    public Person(String uniqueCode, Integer salary) {        super();        this.uniqueCode = uniqueCode;        this.salary = salary;    }    @Override    public String toString() {        return JSONObject.toJSONString(this);    }    public static void main(String[] args) {        Person person1 = new Person("a",1000);        Person person2 = new Person("b",10000);        List<Person> list = new ArrayList<>();        list.add(person1);        list.add(person2);        System.out.println(ListToMapUtil.listToMap(list, "getUniqueCode", Person.class));    }}

执行这个main方法后,在控制台会打印下面的内容

{b={"salary":10000,"uniqueCode":"b"}, a={"salary":1000,"uniqueCode":"a"}}

从结果来看list转成map成功。

后记

实际项目中,很多地方都有这种两个list去循环实现一些逻辑,这个时候就可以,将这部分代码块写成一个工具类,就像上面一样,这样就可以减少代码的重复率,提高代码整体质量。