您的位置:首页 > 财经 > 金融 > Java 8: 根据对象的多个属性去除List中的重复元素

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

2024/10/5 14:03:55 来源:https://blog.csdn.net/FlyingJiang/article/details/141024013  浏览:    关键词: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-- 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com