Java 7升级Java 8:HashMap取默认值后更新的写法是否正确?
问题解答
结论
你给出的Java 8写法是完全正确的,和原Java 7逻辑完全等价,不存在你担心的初始化列表未被使用的问题。
原理说明
Map.computeIfAbsent() 方法的执行逻辑刚好对应你Java 7里的空判断+初始化+存入Map的逻辑,它的返回值规则如下:
- 若传入的key已经在Map中存在且对应值不为null,直接返回该已存在的值
- 若key不存在、或对应值为null,则执行你传入的
x -> new ArrayList<>()lambda表达式生成新的列表,将新列表和key绑定存入Map后,再返回这个新生成的列表
所以不管是哪种情况,你代码中拿到的personList都是已经和当前id绑定、存在于Map中的列表实例,后续调用add(person)就是往该列表添加元素,和原Java 7的执行流程没有任何区别。
拓展:更简洁的流式写法
如果你想进一步简化代码,还可以直接用Java 8的Stream流分组API,一行代码就能完成整个集合的分组操作,不需要手动写循环:
import java.util.stream.Collectors; // 直接完成全量分组 Map<String, List<Person>> somePersonListLookup = databaseListOfPersons.stream() .collect(Collectors.groupingBy(Person::getId));
该写法的效果和你手动循环调用computeIfAbsent的效果完全一致,默认会为每个分组生成ArrayList存储对应元素。
内容的提问来源于stack exchange,提问作者stackerstack
相关产品推荐
相关产品推荐

