如何使用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
相关产品推荐
相关产品推荐

