如何用一行代码实现Map分组时的列表创建与元素添加?
按ZonedDateTime分组ComplexObject列表的单行实现方案
方案1:使用Stream API(推荐)
直接借助Java 8+的Stream Collectors,一行代码完成分组,无需手动处理Map键值的初始化逻辑:
Map<ZonedDateTime, List<ComplexObject>> groupedMap = complexObjectList.stream() .collect(Collectors.groupingBy(ComplexObject::getZonedDateTime));
把ComplexObject::getZonedDateTime替换成你实际用于获取ZonedDateTime字段的方法即可。
方案2:手动操作Map(支持自定义列表实现)
如果需要指定特定的列表类型(比如非默认的ArrayList),可以用Map.computeIfAbsent方法,一行完成「键不存在时创建列表+添加元素」的操作:
complexObjectList.forEach(obj -> groupedMap.computeIfAbsent(obj.getZonedDateTime(), k -> new ArrayList<>()).add(obj));
computeIfAbsent会在目标键不存在时执行Lambda创建列表,返回该列表后直接调用add方法,完美避开返回值类型冲突的问题。
内容的提问来源于stack exchange,提问作者Salvatore Grazioso
相关产品推荐
相关产品推荐

