You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌套HashMap中使用compute方法改写现有代码?

使用HashMap的compute方法优化嵌套Map操作

我有一个嵌套集合 Map<SomeKey, Map<String, Long>> days,还有一个Long类型字段numberOfDays。想改用HashMap的compute方法改写下面这段代码:

Map<String, Long> match2 = new HashMap<>();
if (days.containsKey(matchingKey)) {
    match2 = days.get(matchingKey);
    if (match2.containsKey(mappingNumber)) {
        Long count = match2.get(mappingNumber);
        match2.put(mappingNumber, count + numberOfDays);
    } else {
        match2.put(mappingNumber, numberOfDays);
    }
} else {
    match2.put(mappingNumber, numberOfDays);
}
days.put(matchingKey, match2);

我自己写了一段代码,但不确定是否可行,寻求帮助:

days.compute(matchingKey, (SomeKey, ValueMap) -> {
    ValueMap.compute(mappingNumber, (key, value) ->
        (value == null)? numberOfDays : value + numberOfDays
    );
    return VMValueMap;
});

你的思路方向是对的,但代码里有几个小问题需要修正,同时可以进一步优化逻辑:

  1. 参数名错误:lambda里的参数SomeKey是冗余命名,且最后返回的VMValueMap是笔误,应该和前面的变量名ValueMap保持一致。
  2. 空指针风险:当days中没有matchingKey对应的内部Map时,ValueMap会是null,直接调用ValueMap.compute会抛出空指针异常,必须先做初始化处理。

修正后的代码(基础版)

days.compute(matchingKey, (key, valueMap) -> {
    // 若内部Map不存在,先初始化一个新的HashMap
    if (valueMap == null) {
        valueMap = new HashMap<>();
    }
    // 更新内部Map的计数:不存在则设为numberOfDays,存在则累加
    valueMap.compute(mappingNumber, (k, count) -> count == null ? numberOfDays : count + numberOfDays);
    return valueMap;
});

更简洁的优化版

可以结合computeIfAbsent和compute,让逻辑更清晰,代码更紧凑:

// 先确保外层Map存在对应的内部Map,不存在则自动创建
days.computeIfAbsent(matchingKey, k -> new HashMap<>())
    // 直接对内部Map的指定key执行计数更新
    .compute(mappingNumber, (k, count) -> count == null ? numberOfDays : count + numberOfDays);

这段代码完全等价于你原代码的逻辑:

  • computeIfAbsent会在days中没有matchingKey时,创建并插入新的HashMap,返回该内部Map;若已存在则直接返回现有Map。
  • 后续的compute方法处理计数逻辑:如果mappingNumber不存在,就设置为numberOfDays;如果存在,就累加numberOfDays。

内容的提问来源于stack exchange,提问作者parad0x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:42:50