设为首页 加入收藏

TOP

Java8 Map 示例:一个略复杂的数据映射聚合例子及代码重构(八)
2018-01-10 06:06:41 】 浏览:1708
Tags:Java8 Map 示例 一个 复杂 数据 映射 聚合 例子 代码 重构
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
首页 上一页 5 6 7 8 9 10 下一页 尾页 8/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇杂谈 GC 下一篇谈谈 Tomcat 架构及启动过程[含部..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目