为了账号安全,请及时绑定邮箱和手机立即绑定

如何把这段for循环的代码改成lambda?

如何把这段for循环的代码改成lambda?

守着一只汪 2019-03-21 18:15:13
try {            List<DataDictDO> list = dataDictDao.getAllList("dataDictMapper.getDataDictInfo", null);            DataDictDO bean;            String itemName;            String colName;            DATA_DICT_MAP.clear();            for (int i = 0; i < list.size(); i++) {                bean = list.get(i);                itemName = bean.getItemName();                colName = bean.getColName();                Map<String, String> beanMap;                String itemNameColName = (itemName + "-" + colName);                if (DATA_DICT_MAP.containsKey(itemNameColName)) {                    beanMap = DATA_DICT_MAP.get(itemNameColName);                } else {                    beanMap = new HashMap<String, String>();                }                beanMap.put(bean.getItemVal(), bean.getItemDesc());                DATA_DICT_MAP.put(itemNameColName, beanMap);            }        } catch (Exception e) {            LOG.error("加载数据字典缓存失败!!!", e);        }
查看完整描述

3 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

DATA_DICT_MAP = list.stream().collect(Collectors.groupingBy(

        it -> it.getItemName() + "-" + it.getColName(),

        Collectors.toMap(DataDictDO::getItemVal, DataDictDO::getItemDesc)));

大致思路是这样的,用lambda来实现list转map有以下两种常用方式。


一种是groupingBy,会将同一个key收集到的东西添加一个List当中。


Map<String, List<Foobar>> collected = listOfFoobar.stream().collect(Collectors.groupingBy(Foobar::getKey));

另一种是toMap,一个key只有对应一个value。


Map<String, Foobar> collected = listOfFoobar.stream().collect(Collectors.toMap(Foobar::getKey, Function.identity(),

                (dup1, dup2) -> dup1));

你的问题正好是需要结合这两者,第一步是需要按key聚合,这时候DataDictDO会有多个重复的。第二步则是将包含这些重复对象的列表再根据另一个key做一次聚合,是不重复的。而java.util.stream.Collectors#groupingBy(java.util.function.Function<? super T,? extends K>, java.util.stream.Collector<? super T,A,D>)这个方法正好可以将这两个步骤串在一起。具体可以看一下它的javadoc。


查看完整回答
反对 回复 2019-04-20
?
手掌心

TA贡献1942条经验 获得超3个赞

可以这样


list.forEach(l ->{

    // l是list元素

    ...

}

不过lambda表达式里面不能改变外部对象的引用,显然你的代码不适用。


查看完整回答
反对 回复 2019-04-20
  • 3 回答
  • 0 关注
  • 1769 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号