使用Java merge来汇总Map <string中的数字,map <string,=“”integer =“”>&gt;

时间:2017-12-07 20:57:06

标签: java lambda hashmap

我有一个变量

Map<String, Map<String, Integer>> movieToStateCount

看起来有点像

"movieToStateCount": {
    "Monster's Inc": {
        "Alabama": 1500,
        "Ohio": 5,
        "Hawaii": 715
    },
    "Wall-E": {
        "Alabama": 30000,
        "Ohio": 5000,
        "Hawaii": 14589
    }
}

我得到这些数字的方法是迭代数据库,这样每当我得到一个新条目时,我想在我的movieToStateCount中将我的整数加1。如果我只是更新stateCount,我可以做类似的事情

stateCount.merge(state, 1, Integer::sum);

但是,有没有办法在地图上合并?或者,我是否需要自己进行空检查?

谢谢,

1 个答案:

答案 0 :(得分:2)

在main方法中提出以下函数和一点测试:

public static void main(String[] args) {
    final Map<String, Map<String, Integer>> movieToStateCount = new HashMap<>();
    addTo(movieToStateCount, "Oldboy", "Texas");
    addTo(movieToStateCount, "Oldboy", "Texas");
    addTo(movieToStateCount, "Oldboy", "Alabama");
    addTo(movieToStateCount, "LOTR", "Somewhere");
    System.out.println(movieToStateCount);
  }

  private static void addTo(final Map<String, Map<String, Integer>> movieToStateCount,
          final String movie, final String state) {
    movieToStateCount.merge(movie, new HashMap<String, Integer>() {{ put(state, 1); }},
        (m1, m2) -> { m1.put(state, m1.getOrDefault(state, 0) + m2.get(state)); return m1; });
  }

关于原始问题,我们没有提出一个允许不检查null的解决方案,因为getOrDefault有效地做到了。