Java:合并重复range属性的ContrastItem并求和contrast值
合并重复range的ContrastItem并求和contrast值
需求说明
拥有一个ContrastItem对象列表,需要对具有相同range属性的项求和其contrast值,并移除重复项。
实体类定义
public class ContrastItem { private String range; private Long contrast; // 必须补充构造方法、getter/setter,否则Stream操作无法正常执行 public ContrastItem(String range, Long contrast) { this.range = range; this.contrast = contrast; } public String getRange() { return range; } public void setRange(String range) { this.range = range; } public Long getContrast() { return contrast; } public void setContrast(Long contrast) { this.contrast = contrast; } // 可选:重写toString方便调试输出 @Override public String toString() { return "ContrastItem{" + "range='" + range + '\'' + ", contrast=" + contrast + '}'; } }
输入示例
[ {"contrast": 3, "range": "00:00:00-00:59:59"}, {"contrast": 1, "range": "00:00:00-00:59:59"}, {"contrast": 0, "range": "01:00:00-01:59:59"}, {"contrast": 0, "range": "01:00:00-01:59:59"} ]
期望输出
[ {"contrast": 4, "range": "00:00:00-00:59:59"}, {"contrast": 0, "range": "01:00:00-01:59:59"} ]
未完成的尝试代码
mylist.stream() .collect(Collectors.groupingBy( ContrastItem::getRange,Collectors.summingLong(ContrastItem::getContrast))) .entrySet().stream().map().collect(Collectors.toList());
完整解决方案
你已经找对了核心思路,只需要在map步骤里把分组后的键值对转换回ContrastItem对象即可,完整代码如下:
List<ContrastItem> result = mylist.stream() // 按range分组,对每组的contrast求和 .collect(Collectors.groupingBy( ContrastItem::getRange, Collectors.summingLong(ContrastItem::getContrast) )) // 将分组得到的键值对转为ContrastItem对象 .entrySet() .stream() .map(entry -> new ContrastItem(entry.getKey(), entry.getValue())) // 收集为最终列表 .collect(Collectors.toList());
关键步骤说明
- 分组求和:通过
groupingBy按range分组,配合summingLong计算每组contrast的总和,得到一个Map<String, Long>(键是range,值是对应总和)。 - 对象转换:遍历Map的条目,用每个条目的键和值创建新的
ContrastItem对象。 - 收集结果:把转换后的对象收集成最终的列表。
注意事项
- 必须确保
ContrastItem类有接收range和contrast的构造方法,否则map步骤无法创建对象。 - 原类的getter方法必须存在,否则分组时无法获取
range和contrast的值。
内容的提问来源于stack exchange,提问作者demonpink
相关产品推荐
相关产品推荐

