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 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
用户128526116029 小时前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk9 小时前
组件 = 模板 + 业务逻辑
java·前端·vue.js
星沉远浦10 小时前
用Gemini高效解决Java代码报错难以定位的问题
java
用户2986985301414 小时前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快14 小时前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码14 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking14 小时前
Java微服务练习方式
java·后端·微服务
朦胧之1 天前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅1 天前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java