寫在前面
網上list轉map的方式很多,這裏僅作爲自己學習積累,如有雷同算我抄襲。
需求背景
實際項目中,由於不允許連表查詢,往往是從A表查出list1,從B表查出list2,在內存中循環遍歷根據某一屬性相同,處理一些業務邏輯。當list的數據量大了之後,這種處理方式會比較慢,如果被leader看到這樣的代碼會被噴的。大家都知道Map因爲其獨特存儲方式(不瞭解可以去看下hashMap的源碼分析,網上很多),從Map裏讀數據是非常快的,這個時候將list1或者list2中的某一個轉成map,再去做比對就快很多。
基於反射的實現
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
/**
* *
* @ClassName ListToMapUtil.java
* <p>Description: list轉map,屬性需要提供getter方法</p>
* @author 沉魚
* @date 2017年12月12日 上午9:33:12
*/
public class ListToMapUtil {
private static final Logger LOGGER = LoggerFactory
.getLogger(ListToMapUtil.class);
/***
* 方法名 : listToMap
* <p>Description: </p>
* @author 沉魚
* @date 2017年12月12日 上午9:37:36
* @version 1.0
* @param list //待轉成map的list
* @param fieldMethodName //作爲map的key值的屬性的getter方法名
* @param list中實體的Class實例
* @return Map<K,V>
*/
@SuppressWarnings("unchecked")
public static <K,V> Map<K,V> listToMap(List<V> list,String fieldMethodName,Class<V> c) {
Map<K,V> map = new HashMap<>();
if (!CollectionUtils.isEmpty(list)) {
try {
Method method = c.getMethod(fieldMethodName);
for (int i = 0; i < list.size(); i++) {
V v = list.get(i);
K k = (K)method.invoke(v);
map.put(k, v);
}
} catch (Exception e) {
LOGGER.info("list轉map異常[{}]",e);
}
}
return map;
}
}
這個方法的注意點,上面註釋寫的很清楚,list裏的實體類對應的屬性要
有getter方法
下面測試
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSONObject;
import tf56.ehuodiWarehouse.util.ListToMapUtil;
public class Person {
private String uniqueCode;//唯一碼
private Integer salary;
//這個getter方法不能少
public String getUniqueCode() {
return uniqueCode;
}
public void setUniqueCode(String uniqueCode) {
this.uniqueCode = uniqueCode;
}
public Integer getSalary() {
return salary;
}
public void setSalary(Integer salary) {
this.salary = salary;
}
public Person(String uniqueCode, Integer salary) {
super();
this.uniqueCode = uniqueCode;
this.salary = salary;
}
@Override
public String toString() {
return JSONObject.toJSONString(this);
}
public static void main(String[] args) {
Person person1 = new Person("a",1000);
Person person2 = new Person("b",10000);
List<Person> list = new ArrayList<>();
list.add(person1);
list.add(person2);
System.out.println(ListToMapUtil.listToMap(list, "getUniqueCode", Person.class));
//java 8新特性list轉map相當優雅
Map<Long,Person> map = list.stream().collect(Collectors.toMap(Person::getUniqueCode,a ->a));
}
}
執行這個main方法後,在控制檯會打印下面的內容
{b={"salary":10000,"uniqueCode":"b"}, a={"salary":1000,"uniqueCode":"a"}}
從結果來看list轉成map成功。
後記
實際項目中,很多地方都有這種兩個list去循環實現一些邏輯,這個時候就可以,將這部分代碼塊寫成一個工具類,就像上面一樣,這樣就可以減少代碼的重複率,提高代碼整體質量。