Java8如何实现对象List按姓名去重并保留同姓名下最高ID
按姓名去重且保留最大ID的实现方案
前置准备
首先需要为Person类补充私有字段的getter方法,才能正常读取属性值:
class Person { private String name; private Integer id; // 该字段为唯一值 public String getName() { return name; } public Integer getId() { return id; } // 原有构造、setter等方法无需调整 }
核心实现(Java 8+)
推荐两种常用写法,均可得到预期结果:
写法1:toMap合并策略(更简洁)
通过Map键唯一性结合冲突合并规则实现:
import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; List<Person> uniqueNames = people.stream() .collect(Collectors.toMap( Person::getName, // 以姓名作为Map的key person -> person, // value为Person对象本身 // 遇到重复姓名时,保留ID更大的对象 (existing, replacement) -> existing.getId() > replacement.getId() ? existing : replacement )) .values() // 取出Map中所有保留的Person对象 .stream() // 可选:按ID升序排序,和你给出的示例输出顺序一致 .sorted(Comparator.comparingInt(Person::getId)) .collect(Collectors.toList());
写法2:分组取最大值(可读性更强)
先按姓名分组,每组内取ID最大的对象:
import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; List<Person> uniqueNames = people.stream() .collect(Collectors.groupingBy( Person::getName, // 每组内按ID比较,取最大的对象 Collectors.maxBy(Comparator.comparingInt(Person::getId)) )) .values() .stream() .filter(Optional::isPresent) // 过滤空值,避免空指针 .map(Optional::get) .sorted(Comparator.comparingInt(Person::getId)) .collect(Collectors.toList());
结果验证
两种写法最终得到的uniqueNames集合内容完全符合预期:
['Jerry', 993] ['Tom', 3] ['Neal', 443] ['Shannon', 533]
内容的提问来源于stack exchange,提问作者stackerstack
相关产品推荐
相关产品推荐

