ing kdtId = "";
// 构建itemID映射
for (Map.Entry<String,Map<String,String>> entry: entries) {
String indexKey = entry.getKey();
Map<String,String> value = entry.getValue();
if (indexKey.startsWith(itemBaseDataConf.get(0))) {
old2newItemIdMap.put(indexKey, value.get(itemBaseDataConf.get(1)));
new2oldItemIdMap.put(value.get(itemBaseDataConf.get(1)), indexKey);
orderNo = value.get(itemBaseDataConf.get(2));
kdtId = value.get(itemBaseDataConf.get(3));
}
}
Map<String, Map<String,Object>> newItemIndexMap = aggregationAllInfoOfEachItem(itemIndexMap, new2oldItemIdMap);
return buildFinalOrderItemMap(newItemIndexMap, old2newItemIdMap, orderNo, kdtId);
}
/*
* 聚合每个商品的所有信息
*
* Map[item:id, Map[table:field, value]]
*/
private static Map<String, Map<String,Object>> aggregationAllInfoOfEachItem(Map<String, Map<String,String>> itemIndexMap, Map<String,String> new2oldItemIdMap) {
Map<String, Map<String,Object>> newItemIndexMap = new HashMap<>();
itemIndexMap.forEach(
(indexKey, value) -> {
String table = indexKey.split(":")[0];
if (itemIdConf.containsKey(table)) {
String itemCoreIdField = itemIdConf.get(table);
String itemCoreId = itemIndexMap.get(indexKey).get(itemCoreIdField);
putNewIndexMap(newItemIndexMap, indexKey, value,
key -> new2oldItemIdMap.get(itemCoreId));
}
}
);
return newItemIndexMap;
}
/*
* 将各商品信息聚合到相应的原itemId的键下
*/
private static void putNewIndexMap(Map<String, Map<String,Object>> newItemIndexMap,
String indexKey, Map<String,String> value, Function<String, String> getOriginItemIdFunc) {
String originItemId = getOriginItemIdFunc.apply(indexKey);
if (newItemIndexMap.get(originItemId) == null) {
newItemIndexMap.put(originItemId, new HashMap<>());
}
Map<String,Object> srcMap = newItemIndexMap.get(originItemId);
newItemI
Java8特性
Function
可以看到,putNewIndexMap 使用了 Function 作为参数,让调用方指定如何去获取 originItemId,然后根据获取的originItemId进行通用处理。这里 Function 实现了模板方法模式。
协变
注意到这个方法签名使用了 [ ? extends Object ]。 这里使用了协变特性。即对应参数 Map[String, ? extend Object],既可以传入 Map[String, Object], 也可以传入 Map[String, String] ,或 Map[String, Entity] ,避免从 Map[String, Entity] 到 Map[String, Object] 的无聊转换。
public static Map<String, ? extends Object> merge(Map<String,? extends Object> src, Map<String, ? extends Object> dest)
单测
ItemUtilTest.java
package cc.lovesq.study.test.datastructure;
import org.junit.Test;
import java.util.Arrays;
import java.util.Map;
import cc.lovesq.study.test.CommonForTest;
import zzz.study.utils.ItemUtil;
import zzz.study.utils.JsonUtil;
import zzz.study.utils.NewMapUtil;
/**
* Created by shuqin on 17/11/10.
*/
public class ItemUtilTest extends CommonForTest {
String newItemInfoStr = "{\n"
+ " \"item:s_id:18006666\": \"1024\",\n"
+ " \"item:s_id:18008888\": \"1024\",\n"
+ " \"item:g_id:18006666\": \"6666\",\n"
+ " \"item:g_id:18008888\": \"8888\",\n"
+ " \"item:num:18