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

相关推荐
今天也好累2 分钟前
C 语言基础第16天:指针补充
java·c语言·数据结构·笔记·学习·算法
没有bug.的程序员1 小时前
《Spring Security源码深度剖析:Filter链与权限控制模型》
java·后端·spring·security·filter·权限控制
壹立科技1 小时前
Java源码构建智能名片小程序
java·开发语言·小程序
带刺的坐椅2 小时前
Solon v3.4.2(Java 应用开发生态基座)
java·ai·solon·liteflow·mcp
SirLancelot13 小时前
数据结构-Set集合(一)Set集合介绍、优缺点
java·开发语言·数据结构·后端·算法·哈希算法·set
haaaaaaarry3 小时前
Element Plus常见基础组件(一)
java·前端·javascript·vue.js
歌者長門3 小时前
做题笔记:某大讯飞真题28道
java·数据结构·算法
Savvy..3 小时前
Day05 Maven
java·junit·maven·注解
Goboy3 小时前
我是如何设计出高性能群消息已读回执系统的
java·后端·架构
阳光明媚sunny4 小时前
结构型设计模式
java·设计模式