如何在嵌套Map中正确使用computeIfPresent方法?
嵌套Map使用computeIfPresent的问题解决
嘿,我一眼就瞅出你代码里的问题啦!咱们来拆解下:
你第一个单层Map的写法没问题,是因为computeIfPresent的lambda表达式返回的是Integer类型,正好匹配外层Map的值类型。但到了嵌套Map这里,外层computeIfPresent要求lambda返回的是内层Map(也就是Map<String, Integer>),可你现在的写法里,v.computeIfPresent(anotherKey, (x, y) -> y + 1)返回的是Integer(要么是更新后的数值,要么是null如果anotherKey不存在),类型完全不匹配,编译器当然要报错啦!
给你两种修正方案:
方案一:修正lambda的返回值
直接在lambda里先修改内层Map,然后返回这个内层Map,满足外层computeIfPresent的类型要求:
Map<String, Map<String, Integer>> mapTwo = new HashMap<>(); // 先确保外层key存在,比如先put一个内层Map进去 mapTwo.put("outerKey", new HashMap<>(Map.of("innerKey", 5))); String key = "outerKey"; String anotherKey = "innerKey"; // 正确写法 mapTwo.computeIfPresent(key, (k, v) -> { v.computeIfPresent(anotherKey, (x, y) -> y + 1); return v; // 必须返回修改后的内层Map });
方案二:更健壮的组合写法(推荐)
如果你的场景里外层key可能不存在,需要先初始化内层Map的话,用computeIfAbsent+computeIfPresent的组合会更稳妥,一步到位:
mapTwo.computeIfAbsent(key, k -> new HashMap<>()) .computeIfPresent(anotherKey, (x, y) -> y + 1);
这个写法会先检查外层key:如果不存在就创建一个空的内层Map,然后再对内层Map执行computeIfPresent操作,比单独用computeIfPresent更灵活。
内容的提问来源于stack exchange,提问作者Yves Viegen
相关产品推荐
相关产品推荐

