Java 8: 根据对象的多个属性去除List中的重复元素

在Java 8中,如果你想要根据对象的多个属性去除List中的重复元素,你可以使用Stream API结合Collectors.toMap(或Collectors.groupingBy如果你还需要收集所有相同的元素)来实现。由于Collectors.toMap要求你提供一个keyMapper和一个valueMapper,而在这里我们主要是为了去重,所以可以将整个对象作为value(或者如果你不需要保留所有重复项,只保留一个,则可以忽略valueMapper),并使用这些属性来构造一个唯一的key。

以下是一个示例,假设我们有一个Person类,我们想根据nameage属性去除重复项:

复制代码
import java.util.ArrayList;  
import java.util.List;  
import java.util.Map;  
import java.util.function.Function;  
import java.util.stream.Collectors;  
  
class Person {  
    private String name;  
    private int age;  
  
    // 构造器、getter和setter省略  
  
    public Person(String name, int age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    @Override  
    public String toString() {  
        return "Person{" +  
               "name='" + name + '\'' +  
               ", age=" + age +  
               '}';  
    }  
  
    // 假设有getter  
    public String getName() {  
        return name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
}  
  
public class Main {  
    public static void main(String[] args) {  
        List<Person> people = new ArrayList<>();  
        people.add(new Person("Alice", 30));  
        people.add(new Person("Bob", 25));  
        people.add(new Person("Alice", 30)); // 重复项  
  
        // 使用Stream API和Collectors.toMap去除重复项  
        List<Person> uniquePeople = people.stream()  
                .collect(Collectors.toMap(  
                        person -> person.getName() + "_" + person.getAge(), // 唯一键  
                        Function.identity(), // 值就是Person对象本身  
                        (existing, replacement) -> existing)) // 冲突时保留现有的  
                .values().stream()  
                .collect(Collectors.toList()); // 将Map的values转换为List  
  
        uniquePeople.forEach(System.out::println);  
    }  
}

在这个例子中,我们使用person.getName() + "_" + person.getAge()作为键来确保基于nameage的唯一性。当遇到具有相同键的多个Person对象时,我们通过(existing, replacement) -> existing来指定保留先遇到的元素。最后,我们通过调用.values().stream().collect(Collectors.toList())来将Mapvalues(即去重后的Person对象)转换回List

这种方法简洁而有效,适用于需要根据多个属性去重的场景。

--end--

相关推荐
IT成长史3 分钟前
deepseek梳理java高级开发工程师微服务面试题-进阶版
java·spring cloud·微服务
zkmall13 分钟前
Java + 鸿蒙双引擎:ZKmall开源商城如何定义下一代B2C商城技术标准?
java·开源·harmonyos
陌路物是人非14 分钟前
uniapp取消浏览自动填充
java·服务器·uni-app
獨枭16 分钟前
使用 163 邮箱实现 Spring Boot 邮箱验证码登录
java·spring boot·后端
伍六星16 分钟前
maven和npm区别是什么
java·npm·maven
才知山高路远20 分钟前
Java - Junit框架
java·junit·log4j
维基框架21 分钟前
Spring Boot 封装 MinIO 工具
java·spring boot·后端
秋野酱21 分钟前
基于javaweb的SpringBoot酒店管理系统设计与实现(源码+文档+部署讲解)
java·spring boot·后端
关于不上作者榜就原神启动那件事22 分钟前
Java基础学习
java·开发语言·学习
Black_Cat_yyds1 小时前
设计杂谈-工厂模式
java·开发语言