list转map小练习

小人菜的一B

近日写了个list转map的小的不能再小的小方法……

虽然没有派上用处,但是我感觉也挺不错的,自己的孩子再无用再磕碜只要不危害社会都是宝啊!!哇哈哈!!

package test;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 工具类-练习
 * @author lemon
 * @since 20130925
 */
public class Util {
	public static void main(String args[]) throws SecurityException, NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		/**原谅我下面幼稚的置值,恩恩,new一个list来作为测试,里面放着Person*/
		List<Person> list = new ArrayList<Person>();
		Person p1 = new Person();
		Person p2 = new Person();
		Person p3 = new Person();
		
		p1.setName("lanchenghao");
		p1.setAge("12");
		p1.setSex("男");
		p3.setName("xiongxiong");
		p3.setAge("12");
		p3.setSex("男");
		p2.setName("pengpeng");
		p2.setAge("12");
		p2.setSex("男");
		
		list.add(p1);
		list.add(p2);
		list.add(p3);
		/**进行转换,这里也可以用泛型强制转换下*/
		Map map = Util.listToMap(list,"name", Person.class);
		/**获取对象,并输出*/
		System.out.println(((Person)map.get("pengpeng")).getAge());
		
		
		/**原始思路,然后把这个方法抽象就成了下面的*/
		Map<String,Person> map2 = new HashMap<String,Person>();
		for(int i=0;i<list.size();i++){
			map2.put(list.get(i).getName(), list.get(i));
		}

	}

	/**
	 * List转Map工具方法
	 * 原谅我抛了那么多异常……额 仅做测试之用
	 * @param list 	欲转换list
	 * @param key	指定list中对象某个属性,作为转换后map的key
	 * @param clazz	list中作为转换后value的对象的类型
	 * @return Map<Object,Object>	转换后的map 返回
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws NoSuchMethodException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 */
	public static Map<Object,Object> listToMap(List<?> list,String key,Class<?> clazz) throws SecurityException, NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
		Map<Object,Object> map = new HashMap<Object,Object>();//声明一个map
		Class<?> classType = clazz;//获取类型
		Method getter = Util.obtainGetter(classType, key);//获取getter方法
		for(int i=0;i<list.size();i++){
			//将指定的属性值作为key,对象最为value放入map
			map.put(getter.invoke(list.get(i)), list.get(i));//invoke执行list中对象的getter方法
		}
		return map;		
	}
	
	/**
	 * 获取getter方法
	 * @param clazz	欲进行反射获取的类
	 * @param key	欲获取的getter方法 这里是某一个,也可以扩展成所有的,只需要遍历该对象的所有field
	 * @return	Method 返回方法
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws NoSuchMethodException
	 */
	public static Method obtainGetter(Class<?> clazz,String key) throws SecurityException, NoSuchFieldException, NoSuchMethodException{
		Class<?> classType = clazz;//获取类
		Field field = classType.getDeclaredField(key);//获取属性,Declared可以获取所有声明的属性,包括私有的,如果你用getField则只能获得public修饰的
		String fieldName = field.getName();//获取属性的名称
		String firstChar = fieldName.substring(0,1).toUpperCase();//getter方法 形如getName 这里是获取固定格式的大写字母
		String getterName = "get"+firstChar+fieldName.substring(1);//拼装方法名称 这里的fieldName.substring(1)表示截取 从第一个之后的字符
		Method getter = classType.getDeclaredMethod(getterName);//获取方法
		return getter;
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值