设为首页 加入收藏

TOP

Java8 Map 示例:一个略复杂的数据映射聚合例子及代码重构(七)
2018-01-10 06:06:41 】 浏览:1686
Tags:Java8 Map 示例 一个 复杂 数据 映射 聚合 例子 代码 重构
Key, value); } );

抽离通用逻辑

里面有很多如下重复代码

if (newItemIndexMap.get(oldItemId) == null) {
          newItemIndexMap.put(oldItemId, new HashMap<>());
        }
        newItemIndexMap.get(oldItemId).putAll(value);

实际上就是将新的item_core_id 映射成 item.id ,然后填充到新的Map,可以抽离出一个函数,然后复用。

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);
    newItemIndexMap.get(originItemId).putAll(merge(srcMap, value));
}

调用: putNewIndexMap(newItemIndexMap, indexKey, value, key -> key);

配置化

看如下代码,里面含有 item_price: , item_price:item_id 这样的业务信息,破坏了方法的通用性。

if (indexKey.startsWith("item_price:")) {
        // item_price 与 item_id 一对一关系
        String itemCoreId = itemIndexMap.get(indexKey).get("item_price:item_id");
}

可以抽离出来做成配置。好的配置可以让代码大大简化。仔细思考下整个过程:当 indexKey 包含某个表的前缀时,取它对应的 itemCoreId 的字段,然后得到 itemCoreId ,再根据 putNewIndexMap 方法将对应的 Map 添加到最终的Map中。见如下代码:

private static Map<String,String> itemIdConf = new HashMap() {
    {
      put("item", "item:item_core_id");
      put("item_core", "item_core:id");
      put("item_price", "item_price:item_id");
      put("item_price_change_log", "item_price_change_log:item_id");
    }
};

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

哈!if-elseif-elseif 语句消失了!此时,才说真正抓住了设计重点:将itemId 的映射抽离出来做成配置,然后其它的依此解析。

重构后的ItemUtil

// 这个配置含有新老itemId映射的信息以及获取orderNo, sID 的字段信息
  private static List<String>
      itemBaseDataConf = Arrays.asList("item:", "item:item_core_id",
                                       "item:order_no", "item:s_id");

  private static Map<String,String> itemIdConf = new HashMap() {
    {
      put("item", "item:item_core_id");
      put("item_core", "item_core:id");
      put("item_price", "item_price:item_id");
      put("item_price_change_log", "item_price_change_log:item_id");
    }
  };

  /**

   * 聚合一个订单下的所有商品信息
   * @param itemIndexMap 一个订单所有商品的信息映射
   * @return 一个订单下的所有商品信息
   *
   * key 是 sID + order_no + item_id ;
   */
  private static Map<String, Map<String,Object>> mergeOrderItemMap(Map<String, Map<String,String>> itemIndexMap) {

    if (itemIndexMap == null || itemIndexMap.isEmpty()) {
      return new HashMap<>();
    }

    // Map[oldItemId, newItemId]
    Map<String,String> old2newItemIdMap = new HashMap<>();
    Map<String,String> new2oldItemIdMap = new HashMap<>();

    Set<Map.Entry<String,Map<String,String>>> entries = itemIndexMap.entrySet();
    String orderNo = "";
    Str
首页 上一页 4 5 6 7 8 9 10 下一页 尾页 7/10/10
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇杂谈 GC 下一篇谈谈 Tomcat 架构及启动过程[含部..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目