list轉map工具類
阿新 • • 發佈:2019-02-04
前言
專案中時長需要用到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());
}
// 訂單一