基于反射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去循环实现一些逻辑,这个时候就可以,将这部分代码块写成一个工具类,就像上面一样,这样就可以减少代码的重复率,提高代码整体质量。
阅读全文
1 0
- 基于反射List转Map的一种通用泛型实现
- 基于泛型反射的通用数据层封装
- 基于泛型反射的通用数据层封装
- 关于Intent传输Map,List的一种实现方式
- 反射笔记:一种简单的基于配置文件的IoC实现
- 基于反射实现通用的Excel读取文件
- 一种更通用的编译期反射
- list的一种实现
- 创建通用的List<Map>型Primefaces数据模型
- java 将list转换为map 的泛型通用方法
- 基于泛型的通用Dao接口hibernate实现
- Java List转map通用方法
- java基于反射的Map转Bean的工具类
- java基于反射的Map转Bean的工具类
- 基于java反射筛选List对于不同实体泛型的公共方法
- java反射实现的通用toString
- C++反射的一种实现方式
- 基于JdbcTemplate的一种通用数据库操作帮助工具
- zookeeper清除快照命令
- HLSL风吹草动shader
- Largest prime factor
- Https单向认证和双向认证
- zk安装步骤
- 基于反射List转Map的一种通用泛型实现
- 使用JSR-303进行校验 @Valid
- shared_ptr的使用和陷阱
- LINUX基础命令
- Study List
- ubuntu16.04如何安装php5?
- python简介
- 关于ios系统中滑动有卡顿现象解决方案
- 【C语言】使用VC6.0创建C工程