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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:57:03