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

查看:154
本文介绍了java - 如何把这段for循环的代码改成lambda?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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);
        }

解决方案

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。

这篇关于java - 如何把这段for循环的代码改成lambda?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆