Java 8中能否更简洁地实现集合型Map的操作?
更简洁的Java 8 Map集合操作实现方式
嘿,这个场景我太熟悉了!你现在用compute写的代码确实没完全发挥Java 8新特性的优势,其实咱们可以用computeIfAbsent这个方法来大幅简化逻辑,代码更短还更易读。
先拆解下你的需求逻辑:
- 当键不存在时:创建空Set并添加初始值1(本质上就是给空Set加
0+1) - 当键存在时:给已有Set加
当前size+1
你会发现,两种情况的核心操作其实是统一的——都是给对应键的Set添加该Set当前size+1的值,区别只在于键不存在时要先创建空Set。那用computeIfAbsent就完美适配这个场景:它会自动处理“键不存在则创建新值”的逻辑,并且直接返回对应的集合对象。
优化后的代码如下:
public void process(Map<String, Set<Integer>> m, String key) { Set<Integer> set = m.computeIfAbsent(key, k -> new HashSet<>()); set.add(set.size() + 1); }
甚至可以压缩成一行(不过可读性稍差,更推荐上面两行的写法):
public void process(Map<String, Set<Integer>> m, String key) { m.computeIfAbsent(key, k -> new HashSet<>()).add(m.get(key).size() + 1); }
如果非要坚持用compute方法,也可以把内部的if/else简化成更紧凑的写法,但可读性不如computeIfAbsent方案:
public void process(Map<String, Set<Integer>> m, String key) { m.compute(key, (k, v) -> { Set<Integer> set = v == null ? new HashSet<>() : v; set.add(set.size() + 1); return set; }); }
对比你原来的代码,computeIfAbsent的方案把冗余的分支判断都交给了JDK内置方法处理,代码更简洁直观,完全符合你想要的“简化实现”的需求。
内容的提问来源于stack exchange,提问作者BGRT
相关产品推荐
相关产品推荐

