<>();
Set<Map.Entry<String,Map<String,Object>>> entries = itemIndexMap.entrySet();
for (Map.Entry<String,Map<String,Object>> entry: entries) {
String indexKey = entry.getKey();
Map<String,Object> value = entry.getValue();
String itemId = indexKey.split(":")[1];
String itemKey = sID + "_" + orderNo + "_" + itemId;
finalResult.put(itemKey, value);
}
return finalResult;
}
}
NewMapUtil.java
package zzz.study.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by shuqin on 17/11/10.
*/
public class NewMapUtil {
/**
* 将 map 的值转为字符串类型
*/
public static Map<String,String> transMap(Map<String,Object> map) {
if (map == null) { return null; }
Map<String,String> result = new HashMap<>();
map.forEach(
(k,v) -> result.put(k, v != null ? v.toString(): null)
);
return result;
}
/**
* 将两个 Map 里相同 key 的值合并为列表
*
* eg. src = ["id": 1, "detail": "haha111", "extra":"extra111"] ,
* dest = ["id": 2, "detail": "haha222", "another": "another222"]
* merge 之后返回 ["id": [1,2], "detail": ["haha111", "haha222"], "extra":"extra111", "another": "another222"]
` */
public static Map<String, ? extends Object> merge(Map<String,? extends Object> src, Map<String, ? extends Object> dest) {
if (src == null || src.size() == 0) { return dest; }
if (dest == null || dest.size() == 0) { return src; }
Map<String, Object> result = new HashMap<>();
src.forEach(
(key, value) -> {
Object valueDesc = dest.get(key);
if (valueDesc != null) {
result.put(key, mergeToList(value, valueDesc));
}
else {
result.put(key, value);
}
}
);
dest.forEach(
(key, value) -> {
if (result.get(key) == null) {
result.put(key, value);
}
}
);
return result;
}
public static List mergeToList(Object src, Object... args) {
List valList = new ArrayList();
add(valList, src);
for (Object arg: args) {
add(valList, arg);
}
return valList;
}
public static List add(List valList, Object src) {
if (src == null) { return valList; }
if (src instanceof List) {
valList.addAll((List)src);
}
else {
valList.add(src);
}
return valList;
}
}
可以看到,初步实现虽然实现了功能,可是代码比较乱,尤其是 mergeOrderItemMap 方法,混杂了业务表的逻辑,理解和扩展起来比较麻烦。需要仔细重构下。另外,Map的遍历访问比较啰嗦,可以更简洁一些。
使用forEach进行Map遍历
重构从简单做起。原来使用了
Set<Map.Entry<String,Map<String,Object>>> entries = itemIndexMap.entrySet();
for (Map.Entry<String,Map<String,Object>> entry: entries) {
String indexKey = entry.getKey();
Map<String,Object> value = entry.getValue();
String itemId = indexKey.split(":")[1];
String itemKey = sID + "_" + orderNo + "_" + itemId;
finalResult.put(itemKey, value);
}
在 java8 中可使用 forEach 语法简洁表达:
itemIndexMap.forEach(
(indexKey,value) -> {
String itemId = indexKey.split(":")[1];
String itemKey = sID + "_" + orderNo + "_" + itemId;
finalResult.put(item