之前整理过一份lambda表达式转换list的代码
但使用的地方多了之后,就会察觉到代码有很多重复的地方,不够简洁
因此将一些list转换map的操作提取出来
还是以MyObject对象为例
@Data //lombok 注解,替代get、set方法
public class MyObject{
private Long id;
private String skuCode;//sku编码
private Integer skuNum;//sku数量
private Integer warehouseId;//仓库ID
public String getKey(){
return warehouseId+"_"+skuCode;
}
}
List<MyObject> myObjectList = new ArrayList<>();
MyObject o1 = new MyObject();
o1.setSkuCode("aaa");
o1.setSkuNum(88);
o1.setWarehouseId(1);
myObjectList.add(o1);
MyObject o2 = new MyObject();
o2.setSkuCode("bbb");
o2.setSkuNum(99);
o1.setWarehouseId(1);
myObjectList.add(o2);
一些公用方法
public static final Collection NULL_COLLECTION = new NullCollection();
public static final <T> Collection<T> nullCollection() {
return (List<T>) NULL_COLLECTION;
}
public static <K, V, T> K getFildByName(String key, T obj) {
Field field = null;
Class<?> clazz = obj.getClass();
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
try {
field = clazz.getDeclaredField(key);
field.setAccessible(true);
return (K) field.get(obj);
} catch (Exception e) {
}
}
return null;
}
public static String genKey(Object... keys) {
StringBuilder result = new StringBuilder();
for (Object obj : keys) {
if (isNotEmpty(result)) {
result.append("_");
}
result.append(obj);
}
return result.toString();
}
1、list生成一个Map<Object, Object> K可以是对象的某个字段,V可以是对象的某个字段(valueProp传字段名),也可以是对象MyObject本身(valueProp传null)
比如 Map<String,Integer> (key为skuCode,value为skuNum) testMap = this.listForMap(myObjectList ,"skuCode","skuNum");
比如 Map<String,MyObject> (key为skuCode,value为MyObject) testMap = this.listForMap(myObjectList ,"skuCode",null);
public static <K, V, E> Map<K, V> listForMap(List<E> list, String keyProp, String valueProp) {
Map<K, V> rs = new HashMap<K, V>(list.size());
if (CommonUtil.isEmpty(list)) {
return rs;
}
list.removeAll(nullCollection());
for (E object : list) {
K key = getFildByName(keyProp, object);
Object value = null;
if (CommonUtil.isEmpty(valueProp)) {
value = object;
} else {
value = getFildByName(valueProp, object);
}
if (value != null) {
rs.put(key, (V) value);
}
}
return rs;
}
2、list生成Map<String, V> key可以是一个或多个字段以下划线拼接而成,V可以是对象的某个字段或对象本身
比如 Map<String,Integer> (key为skuCode_warehouseId,value为skuNum) testMap = this.listForMap(myObjectList ,null,"skuNum","skuCode","warehouseId");
比如 Map<String,MyObject> (key为skuCode_warehouseId,value为MyObject) testMap = this.listForMap(myObjectList ,null,null,"skuCode","warehouseId");
public static <E, K, V> Map<String, V> listForMap(List<E> list, String keyProp, String valueProp, String... keyProps) {
Map<String, V> rs = new HashMap<>();
if (CommonUtil.isEmpty(list)) {
return rs;
}
list.removeAll(nullCollection());
for (E object : list) {
String key = getFildByName(keyProp, object) == null ? "" : getFildByName(keyProp, object).toString();
if (isNotEmpty(keyProps)) {
for (String tempKeyProp : keyProps) {
String tempKey = getFildByName(tempKeyProp, object) == null ? "" : getFildByName(tempKeyProp, object).toString();
key = genKey(key, tempKey);
}
}
Object value = null;
if (CommonUtil.isEmpty(valueProp)) {
value = object;
} else {
value = getFildByName(valueProp, object);
}
if (value != null) {
rs.put(key, (V) value);
}
}
return rs;
}
3、list生成一个Map<K,List<V>> V可以是对象的某个字段(valueProp传字段名),也可以是对象MyObject本身(valueProp传null)
比如 Map<String,List<Integer>> (key为warehouseId,value为skuNum) testMap = this.listforListMap(myObjectList ,"warehouseId","skuNum");
比如 Map<String,List<MyObject>> (key为warehouseId,value为skuNum) testMap = this.listforListMap(myObjectList ,"warehouseId",null);
public static <K, V, E> Map<K, List<V>> listforListMap(List<E> list,String keyProp, String valueProp) {
Map<K, List<V>> rs = new HashMap<K, List<V>>();
if (CommonUtil.isEmpty(list)) {
return rs;
}
list.removeAll(nullCollection());
rs = new HashMap<K, List<V>>(list.size());
V value = null;
for (E object : list) {
K key = getFildByName(keyProp, object);
if (CommonUtil.isEmpty(valueProp)) {
value = (V) object;
} else {
value = (V) getFildByName(valueProp, object);
}
if (key == null) {
continue;
}
List<V> values = rs.get(key);
if (values == null) {
values = new ArrayList<V>();
}
values.add(value);
rs.put(key, values);
}
return rs;
}