Java stream流实现List<对象>通过对象中的多个字段去重

遇到同时通过多个字段对list进行去重需求,记录一下

先创建一个实体类
java 复制代码
@Data
public class User {

    private Long id;

    private String name;

    private String code;
    
    private String phone;
    
    private Integer age;
    
 	public User(Long id, String name, String code, String phone, Integer age) {  
        this.id = id;  
        this.name = name;  
        this.code = code;  
        this.phone = phone;  
        this.age = age;  
    }
    
    public User() {}

}
创建一个List对象,并添加一些重复元素
java 复制代码
List<User> userList = new ArrayList<>();
userList.add(new User(1L, "张三", "1001", "99999999", 21));
userList.add(new User(1L, "张三", "1001", "99999999", 21)); // 重复
userList.add(new User(3L, "张三", "1001", "99999999", 22));
userList.add(new User(4L, "张三", "1001", "99999999", 21));
userList.add(new User(5L, "张四", "1002", "88888888", 21));
普通去重写法
java 复制代码
List<User> list = userList.stream()  
    .distinct() // 使用默认的equals方法进行去重  
    .collect(Collectors.toList());

输出:

java 复制代码
[User(id=1, name=张三, code=1001, phone=99999999, age=21),
 User(id=3, name=张三, code=1001, phone=99999999, age=22),
 User(id=4, name=张三, code=1001, phone=99999999, age=21),
 User(id=5, name=张四, code=1002, phone=88888888, age=21)]
比如现在要通过name、code、phone去重
java 复制代码
List<User> list = userList.stream()
	.collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
                new TreeSet<>
                (Comparator.comparing(User::getName)
                .thenComparing(User::getCode)
                .thenComparing(User::getPhone))),
                 ArrayList::new));

以上是使用Collectors.collectingAndThen收集器将流中的元素收集到一个TreeSet中。这个TreeSet会根据User对象的name、code和phone字段进行排序和去重。最后,再使用ArrayList::new将排序后的TreeSet中的元素收集到一个新的ArrayList中。

输出结果:

java 复制代码
[User(id=1, name=张三, code=1001, phone=99999999, age=21), 
User(id=5, name=张四, code=1002, phone=88888888, age=21)]

可以看到结果都去重成功了

相关推荐
Joy T1 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
m0_587383004 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·4 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
代码不停5 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金7 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck8 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Wang's Blog8 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
Wang's Blog9 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网9 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff9 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈