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);
}
可以这样
list.forEach(l ->{
// l是list元素
...
}
不过lambda表达式里面不能改变外部对象的引用,显然你的代码不适用。
以下代码手敲,不排除有语法错误的可能。
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
工具库,链接。
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。