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

 你走之后你的美我如何收拾_686 发布于 2022-10-27 15:57
try {
            List 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 beanMap;
                String itemNameColName = (itemName + "-" + colName);
                if (DATA_DICT_MAP.containsKey(itemNameColName)) {
                    beanMap = DATA_DICT_MAP.get(itemNameColName);
                } else {
                    beanMap = new HashMap();
                }
                beanMap.put(bean.getItemVal(), bean.getItemDesc());
                DATA_DICT_MAP.put(itemNameColName, beanMap);
            }
        } catch (Exception e) {
            LOG.error("加载数据字典缓存失败!!!", e);
        }
3 个回答
  • 以下代码手敲,不排除有语法错误的可能。

    list.stream()
    .forEach(bean -> {
        String itemName = bean.getItemName();
        String colName = bean.getColName();
        String itemNameColName = itemName + "-" + colName;
        Map<String, String> beanMap = DATA_DICT_MAP.get(itemNameColName);
        if (CollectionUtils.isEmpty(beanMap)) {
            beanMap = new HashMap<>();
        }
        beanMap.put(bean.getItemVal(), bean.getItemDesc());
        DATA_DICT_MAP.put(itemNameColName, beanMap);
    });

    看起来你的数据结构有点复杂,建议你看一下guava工具库,链接。

    2022-11-12 01:41 回答
  • 可以这样

    list.forEach(l ->{
        // l是list元素
        ...
    }

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

    2022-11-12 01:41 回答
  • 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。

    2022-11-12 01:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有