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对象的namecodephone字段进行排序和去重。最后,再使用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)]

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

相关推荐
考虑考虑9 分钟前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干18 分钟前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying1 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·1 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
Bug退退退1232 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠2 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
Zz_waiting.2 小时前
Javaweb - 10.4 ServletConfig 和 ServletContext
java·开发语言·前端·servlet·servletconfig·servletcontext·域对象
全栈凯哥2 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
兮动人2 小时前
获取终端外网IP地址
java·网络·网络协议·tcp/ip·获取终端外网ip地址
呆呆的小鳄鱼2 小时前
cin,cin.get()等异同点[面试题系列]
java·算法·面试