如何正确使用Java的computeIfAbsent方法替换Map的条件操作?
正确使用computeIfAbsent改写你的代码
你的问题出在对computeIfAbsent的lambda参数理解错误——这个方法的第二个参数是生成新值的函数,不需要你手动调用put,函数只需返回要插入的值即可。你当前的代码里,lambda调用result.put(someID, hashy)会返回null(因为此时键不存在),导致Map最终存入的是null而非你创建的HashSet,自然无法正常工作。
正确写法(最简洁高效)
直接通过computeIfAbsent的返回值获取目标集合,完全替代原有的if-else逻辑:
hashy = result.computeIfAbsent(someID, k -> new HashSet<>());
写法解释
computeIfAbsent的工作逻辑正好匹配你的需求:
- 如果
result中已存在someID这个键,直接返回对应的Set对象,赋值给hashy; - 如果
result中不存在someID,执行lambda表达式创建新的HashSet,自动将someID和这个新集合存入Map,再返回该集合赋值给hashy。
额外说明
如果你确实需要提前创建hashy(比如有额外初始化逻辑),也可以这么写(但不如上面的写法高效,因为键存在时新创建的集合会被浪费):
hashy = new HashSet<>(); hashy = result.computeIfAbsent(someID, k -> hashy);
这里lambda只需直接返回提前创建好的hashy即可,computeIfAbsent会自动处理存入逻辑。
内容的提问来源于stack exchange,提问作者eazy
相关产品推荐
相关产品推荐

