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