设为首页 加入收藏

TOP

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目