前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >将List转化为Map的通用方法—泛型方法的简单运用

将List转化为Map的通用方法—泛型方法的简单运用

作者头像
java达人
发布2018-01-31 18:09:10
2.1K0
发布2018-01-31 18:09:10
举报
文章被收录于专栏:java达人

有时候我们需要将List转化为Map,将数据散列存储,以提高查询效率。但是集合类中所存放的对象类型是不同的,因此,针对不同类型,我们常会写多个逻辑重复的转化方法,如:

代码语言:js
复制
 public static Map<Integer, Person> listPersonToMap(List<Person> vList) {
  //转化代码
  Map<Integer, Person> map = new HashMap<Integer, Person>();
  for(Person p:vList){
   map.put(p.getUserId(), p);
  }
  return map;
 }
 public static Map<String, Dog> listDogToMap(List<Dog> vList) {
  //转化代码
  Map<String, Dog> map = new HashMap<String, Dog>();
  for(Dog d:vList){
   map.put(d.getDogCode(), d);
  }
  return map;
 }

重复劳动是程序员的天敌,程序员的任务就是尽一切可能消除这些繁琐的体力劳动,实现自动化,这里,我们可以自定义一个泛型方法,一劳永逸。自定义泛型方法时,只要在方法返回值前面使用<>声明泛型类型,则在返回值,参数,方法体内都可以使用该泛型类型。

代码语言:js
复制
//list转化为map
 public static <K, V> Map<K, V> listToMap(List<V> vList, String kName) {
  Map<K, V> map = new HashMap<K, V>();
  if (vList == null || kName == null || vList.size() == 0) {
   return map;
  }
  Field kField = getField(vList.get(0).getClass(), kName);
  for (V v : vList) {
   try {
    map.put((K) kField.get(v), v);
   } catch (IllegalArgumentException e) {
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    e.printStackTrace();
   }
  }
  return map;
 }

在转化过程中,key对应的字段类型和名称需要动态获取,我们传入kName参数,并利用Class#getDeclaredFields()获取字段并循环比较java.lang.reflect.Field#getName()字段名称,返回其类型对象,如下:

代码语言:js
复制
//获取key对应的类型字段
 private static <V> Field getField(Class<V> clazz, String kName) {
  if (clazz == null || kName == null) {
   return null;
  }
  for (Field fieldElem : clazz.getDeclaredFields()) {
   fieldElem.setAccessible(true);
   if (fieldElem.getName().equals(kName)) {
    return fieldElem;
   }
  }
  return null;
 }
//调用示例
 public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
  List<Person> pList = new ArrayList<Person>();
  Person p1 = new Person(2, "taxuexing");
  pList.add(p1);
  Person p2 = new Person(3, "jikewang");
  pList.add(p2);
  Map<Integer, Person> map = MapUtil.listToMap(pList, "userId");
  System.out.println(map.get(2).getUserName());
  System.out.println(map.get(3).getUserName());
 }
}

输出:

taxuexing

jikewang

反射技术毕竟对性能有一定影响,有更好的实现方式的伙伴欢迎留言。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档