You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());

关键步骤说明

  1. 分组求和:通过groupingBy按range分组,配合summingLong计算每组contrast的总和,得到一个Map<String, Long>(键是range,值是对应总和)。
  2. 对象转换:遍历Map的条目,用每个条目的键和值创建新的ContrastItem对象。
  3. 收集结果:把转换后的对象收集成最终的列表。

注意事项

  • 必须确保ContrastItem类有接收range和contrast的构造方法,否则map步骤无法创建对象。
  • 原类的getter方法必须存在,否则分组时无法获取range和contrast的值。

内容的提问来源于stack exchange,提问作者demonpink

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 21:35:19