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

如何用Java Stream按codeName筛选各分组最新version的CodeObj

解决方案

要实现按codeName分组并筛选每组最新version的元素,核心是先通过Stream完成分组操作,再对每组单独求最大值。完整代码如下:

import java.util.List;
import java.util.NoSuchElementException;
import java.util.stream.Collectors;
import java.util.Comparator;

public class VersionFilter {
    public static void main(String[] args) {
        List<CodeObj> codeObjs = // 你的原始CodeObj集合
        
        List<CodeObj> latestCodeObjs = codeObjs.stream()
            // 1. 按codeName分组,得到{codeName: 对应CodeObj列表}的映射
            .collect(Collectors.groupingBy(CodeObj::getCodeName))
            // 2. 遍历每个分组,处理每组数据
            .entrySet().stream()
            .map(entry -> entry.getValue().stream()
                // 3. 找出当前分组中version最大的元素
                .max(Comparator.comparing(CodeObj::getVersion))
                // 每组至少有一个元素,用orElseThrow避免空值
                .orElseThrow(() -> new NoSuchElementException("分组内无有效元素")))
            // 4. 收集所有分组的结果为最终List
            .collect(Collectors.toList());
    }
}

关键细节说明:

  • 分组逻辑:Collectors.groupingBy(CodeObj::getCodeName)是核心步骤,它会把原始List按codeName拆分成多个子集合,存储在一个Map中。
  • 版本号比较注意事项:示例中直接用字符串比较version,但如果你的版本号是数字格式(比如"10"和"2"),字符串比较会出现"10"<"2"的错误结果,此时需要转成数值类型再比较:
    // 整数版本号用int比较
    .max(Comparator.comparingInt(obj -> Integer.parseInt(obj.getVersion())))
    // 长整数版本号用long比较
    .max(Comparator.comparingLong(obj -> Long.parseLong(obj.getVersion())))
    
  • 空值处理:orElseThrow是因为每个分组必然包含至少一个元素(原始集合中存在对应codeName的元素),如果需要兼容空分组场景,也可以用orElse(null)返回空值,但不推荐。

你之前写的codeObjs.stream().max(...)是对整个集合求最大值,没有按codeName拆分分组,所以必须先完成分组再处理每组的最大值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:35:25