Java Stream分组时如何映射元素返回Map<Long, List<String>>
实现方案
直接使用Collectors.groupingBy的重载方法,搭配下游映射收集器即可一步得到目标结构,无需先分组实体再做二次转换,执行效率更高。
核心逻辑:
- 分组键保持原有逻辑,取
RCouponDetailEntity的rCouponId字段 - 分组后对每组的元素做映射,提取
code字段值,再将提取出的字符串收集为List<String>
完整实现代码:
Map<Long, List<String>> couponIdToCodesMap = rCouponDetailDAO.getAllDetailsByCouponId(couponIds) .stream() .collect(Collectors.groupingBy( RCouponDetailEntity::getRCouponId, Collectors.mapping(RCouponDetailEntity::getCode, Collectors.toList()) ));
如果你是基于已经生成的Map<Long, List<RCouponDetail>>类型的details变量做二次转换,可以用以下写法:
Map<Long, List<String>> couponIdToCodesMap = details.entrySet() .stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue() .stream() .map(RCouponDetail::getCode) .collect(Collectors.toList()) ));
注意:上述代码默认
getCode()方法返回String类型,和目标集合的泛型匹配,如果你的code字段是其他类型,调整对应泛型即可。优先推荐第一种一步写法,减少中间集合创建,性能更优。
内容的提问来源于stack exchange,提问作者None
相关产品推荐
相关产品推荐

