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

相关推荐
沈询-阿里38 分钟前
java-智能识别车牌号_基于spring ai和开源国产大模型_qwen vl
java·开发语言
AaVictory.44 分钟前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list
LuckyLay1 小时前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
向阳12181 小时前
Dubbo负载均衡
java·运维·负载均衡·dubbo
水月梦镜花1 小时前
redis:list列表命令和内部编码
数据库·redis·list
Gu Gu Study2 小时前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
WaaTong2 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048442 小时前
初识Java EE和Spring Boot
java·java-ee
AskHarries2 小时前
Java字节码增强库ByteBuddy
java·后端
小灰灰__2 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea