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--

相关推荐
江喜原1 分钟前
微服务下设计一个注解标识是否需要登录
java·微服务·架构·登录
ABin-阿斌8 分钟前
SpringBoot 整合 Easy_Trans 实现翻译的具体介绍
java·spring boot·后端
菜鸟求带飞_10 分钟前
算法打卡:第十一章 图论part03
java·数据结构·算法·深度优先·图论
圆头圆脑圆JAVA10 分钟前
简单了解微服务--黑马(在更)
java·spring boot·微服务
木子欢儿17 分钟前
在 Debian 12 上安装 Java 21
java·运维·开发语言·debian
一二小选手20 分钟前
【高级编程】XML DOM4J解析XML文件(含案例)
xml·java
终末圆22 分钟前
MyBatis XML映射文件编写【后端 18】
xml·java·开发语言·后端·算法·spring·mybatis
就这个java爽!22 分钟前
超详细的XML介绍【附带dom4j操作XML】
xml·java·开发语言·数据库·青少年编程·eclipse
kunkun10124 分钟前
Mybatis的XML实现方法
xml·java·mybatis
libai30 分钟前
STM32 USB HOST CDC 驱动CH340
java·前端·stm32