list转map工具类

来源:互联网 发布:怎么提高软件质量 编辑:程序博客网 时间:2024/05/21 06:56

前言

项目中时长需要用到list转map的场景,比如需要查询所有用户的订单列表,但是用户和订单不在一个库的时候,无法进行join操作,就只能程序处理:先查询一批用户,再根据用户的id列表批量查询订单列表,然后在程序中拼接用户和其对应订单。因此写了个小工具类处理,现在分享出来。

工具类代码

package utils;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.HashMap;import java.util.List;import java.util.Map;/** * Created by Jack.wu on 2017/5/23. */public class ExtCollectionUtils {    /**     *  list转map     * @param list     * @param keyField 需要成为为键的字段名称     * @param <K>     * @param <V>     * @return     */    public static <K,V> Map<K,V> listToMap(List<V> list, String keyField){        Map<K,V> result = new HashMap<>();        if(list != null && list.size() > 0 && keyField != null && !"".equals(keyField)){            String firstLetter = keyField.substring(0, 1).toUpperCase();            String getter = "get" + firstLetter + keyField.substring(1);            try {                for(Object obj : list){                    Method method = obj.getClass().getMethod(getter,null);                    K key = (K) method.invoke(obj,null);                    if(key != null){                        result.put(key,(V) obj);                    }                }            } catch (NoSuchMethodException e) {                e.printStackTrace();            } catch (IllegalAccessException e) {                e.printStackTrace();            } catch (InvocationTargetException e) {                e.printStackTrace();            }        }        return result;    }}

测试

代码片段一:
public class Order {    private Integer userId;    private Integer orderId;    private String orderName;    //constructor    //getter、setter}
代码片段二:
public static void main(String[] args) {    List list = new ArrayList();    list.add(new Order(1,100,"订单一"));    list.add(new Order(2,200,"订单二"));    Map<Integer,Order> userMap = ExtCollectionUtils.listToMap(list,"userId");    System.out.println(userMap.get(1).getOrderName());}// 订单一