基於反射List轉Map的一種通用泛型實現

寫在前面

網上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去循環實現一些邏輯,這個時候就可以,將這部分代碼塊寫成一個工具類,就像上面一樣,這樣就可以減少代碼的重複率,提高代碼整體質量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章