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

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

 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;

 }

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

//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()字段名称,返回其类型对象,如下:

//获取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

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值