当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C控制语句:循环(1)
  • Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N]……解决
  • 七夕表白网页效果实现与解析
  • C++的7种设计模式原则
  • kafka下载|安装
  • C#(asp.net)电商后台管理系统-计算机毕业设计源码70015
  • 混合专家模型(MoE)入门
  • 接口中的方法到底能有具体实现吗?
  • c# 排序、强转枚举
  • IS-IS协议
  • 某MDM主数据管理系统与微软Dynamic CRM系统(新加坡节点)集成案例
  • 大模型12:知识图谱 图数据库
  • 深入学习小程序第二天:事件处理与用户交互
  • Android 14 Power键亮灭屏流程
  • 深入理解小程序的渲染机制与性能优化策略
  • CentOS7 安装JDK
  • ComponentOne 2017 V2版本正式发布
  • idea + plantuml 画流程图
  • JS基础之数据类型、对象、原型、原型链、继承
  • JS实现简单的MVC模式开发小游戏
  • Less 日常用法
  • Linux Process Manage
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • nginx 配置多 域名 + 多 https
  • Spring框架之我见(三)——IOC、AOP
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 你真的知道 == 和 equals 的区别吗?
  • 项目管理碎碎念系列之一:干系人管理
  • 新手搭建网站的主要流程
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 主流的CSS水平和垂直居中技术大全
  • 最简单的无缝轮播
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • Python 之网络式编程
  • ​插件化DPI在商用WIFI中的价值
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • ######## golang各章节终篇索引 ########
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #include<初见C语言之指针(5)>
  • $.ajax()参数及用法
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)SpringCloud 整合Python
  • (LLM) 很笨
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (TOJ2804)Even? Odd?
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (备忘)Java Map 遍历
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程