通用list转map

Lambda表达式转换List整理

之前整理过一份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;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值