Map集合中的computeIfAbsent() 的使用

Map集合中的computeIfAbsent() 的使用

问题

今天遇到了一个为问题,就是再看 Ruo-Yi 源码的时候,看到下面的代码:

public void loadingDictCache()
{
    SysDictData dictData = new SysDictData();
    dictData.setStatus("0");
    Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType));
    for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet())
    {
        DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList()));
    }
}

这段代码其实使用了 函数式编程,但是我对这个不太熟悉,就将上面的代码分解下面的形式方便我自己理解:

public void loadingDictCache()
{
    SysDictData dictData = new SysDictData();
    dictData.setStatus("0");
    Map<String, List<SysDictData>> dictDataMap = new HashMap<>();
    //  dictDataMapper.selectDictDataList(dictData) 查询sys_dict_data表里面所有状态为 0 的数据
    // 遍历 上面注释查询的所有数据
    for (SysDictData sysDictData : dictDataMapper.selectDictDataList(dictData)) {
        dictDataMap.computeIfAbsent(sysDictData.getDictType(), k -> new ArrayList<>()).add(sysDictData);
    }
    for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet())
    {
        DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList()));
    }
}

这样就好理解多了,其中还有一个问题,它使用了Map集合的computeIfAbsent() 方法,这个方法是我之前没有用过的。

computeIfAbsent()

作用:判断一个map中是否存在这个key,如果存在则处理value的数据,如果不存在,则创建一个满足value要求的数据结构放到value中。

​ 例子

public void test() {
    Map<String, List<String>> map = new HashMap<>();
    // 如果key不存在,则创建新list并放入数据;key存在,则直接往list放入数据
    map.computeIfAbsent("fruit", k -> new ArrayList<>()).add("apple");
    map.computeIfAbsent("fruit", k -> new ArrayList<>()).add("orange");
    map.computeIfAbsent("language", k -> new ArrayList<>()).add("english");
    // 遍历
    map.forEach((k, v) -> System.out.println(k + " " + v));
}
map.computeIfAbsent("fruit", k -> new ArrayList<>()).add("apple");
这一句的意思是
key为fruit的键值对是否存在
1、如果存在,则给当前操作的List集合添加 apple
2、如果不存在,则新创建List结构,将apple添加到List集合,再存入Map集合

在这里插入图片描述

Ruo-Yi 源代码的意思

public void loadingDictCache()
{
    SysDictData dictData = new SysDictData();
    dictData.setStatus("0");
    Map<String, List<SysDictData>> dictDataMap = new HashMap<>();
    //  dictDataMapper.selectDictDataList(dictData) 查询sys_dict_data表里面所有状态为 0 的数据
    // 遍历 上面注释查询的所有数据
    for (SysDictData sysDictData : dictDataMapper.selectDictDataList(dictData)) {
        // 根据 字典类型【dictType】是否相同 将 所有的 SysDictData 封装成 list 集合,
        // computeIfAbsent()方法的意思是:判断一个map中是否存在这个key,如果存在则处理value的数据,如果不存在,则创建一个满足value要求的数据结构放到value中
        // 在这里是 判断一个dictDataMap中是否存在这个key【sysDictData.getDictType()】,如果存在则给当前的list集合添加sysDictData
        // 如果不存在,则创建一个list集合 key【sysDictData.getDictType()】,将数据sysDictData加入到这个list集合中,再存入map
        dictDataMap.computeIfAbsent(sysDictData.getDictType(), k -> new ArrayList<>()).add(sysDictData);
    }
    // 遍历 map集合
    for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet())
    {
        // 保存到 Redis 里面,key为 SYS_DICT_KEY = "sys_dict:";+entry.getKey()
        DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList()));
    }
}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值