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

如何使用Java 8从对象列表中获取各名称对应最高版本的对象列表

用Java 8特性实现按名称保留最高版本对象的需求

完全可以用Java 8的Stream API结合Collectors工具类实现这个需求,核心思路是按名称分组后,提取每组中版本号最大的对象。

1. 定义实体类

首先需要一个包含name和version属性的实体类,示例如下:

public class App {
    private String name;
    private Integer version;

    // 构造器
    public App(String name, Integer version) {
        this.name = name;
        this.version = version;
    }

    // Getter方法(Stream操作需要读取属性)
    public String getName() {
        return name;
    }

    public Integer getVersion() {
        return version;
    }

    // 重写toString方便打印结果
    @Override
    public String toString() {
        return "{\"name\": \"" + name + "\", \"version\": " + version + "}";
    }
}

2. 核心实现代码

利用Stream的collect方法,结合分组和筛选逻辑完成需求:

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

public class Main {
    public static void main(String[] args) {
        // 模拟输入列表
        List<App> appList = List.of(
                new App("ss", 1),
                new App("ss", 2),
                new App("sam", 1),
                new App("sam", 2),
                new App("sim", 1)
        );

        // 按name分组,每组保留version最大的对象,最终转为List
        List<App> resultList = appList.stream()
                .collect(Collectors.groupingBy(
                        App::getName,
                        Collectors.collectingAndThen(
                                Collectors.maxBy(Comparator.comparingInt(App::getVersion)),
                                optionalApp -> optionalApp.orElse(null)
                        )
                ))
                .values()
                .stream()
                .collect(Collectors.toList());

        // 打印结果
        resultList.forEach(System.out::println);
    }
}

代码说明

  • Collectors.groupingBy(App::getName):将列表按name属性分组,把相同名称的对象归为一组。
  • Collectors.collectingAndThen(...):对每组进行二次处理,先用Collectors.maxBy基于version找到组内版本最高的对象(返回Optional<App>),再通过orElse(null)取出实际对象(示例中不会出现空分组,此处理为通用兼容)。
  • 最后通过values().stream().collect(Collectors.toList())将分组后的结果转换为目标列表。

运行代码后输出结果与需求一致:

{"name": "ss", "version": 2}
{"name": "sam", "version": 2}
{"name": "sim", "version": 1}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:15:36