java stream distinct根据list某个字段去重

项目场景:

java stream distinct根据list某个字段去重,普通List简单去重:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List<String> names = Arrays.asList("张三", "李四", "王五", "张三", "李四");// 使用Stream的distinct()方法进行去重操作List<String> distinctNames = names.stream().distinct().collect(Collectors.toList());System.out.println("原始列表:" + names);System.out.println("去重后的列表:" + distinctNames);}
}

很显然这种满足不了需求,我们List里的是实体对象,这里的是字符串。


前提基础: 

首先创建了一个Student类,该类包含id、name、age三个字段,使用了注解@Data,我们想根据学生的name去重。

import lombok.Data;@Data
public class Student {public Student(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}private Integer id;private String name;private Integer age;
}

解决方案:

一、Stream流 + TreeSet(推荐)

根据学生的name去重,原理:

        1、首先使用Stream API对list进行转换成流,使用toCollection方法将流中的元素放入一个TreeSet集合中,通过TreeSet实现对name字段去重;

        2、然后使用collectingAndThen方法将TreeSet集合转换成ArrayList集合;

用普通的list对象来操作需要分为两步操作,这里我们使用了Stream API提供的collect方法和Collectors类的两个静态方法toCollection和collectingAndThen来进行去重操作,不需要写繁琐的for循环,更加简洁高效。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(1, "张三", 13));list.add(new Student(2, "李四", 14));list.add(new Student(3, "张三", 15));list.add(new Student(4, "王五", 16));list.add(new Student(5, "李四", 17));List<Student> distinctList = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))), ArrayList<Student>::new));System.out.println(distinctList);}
}

二、Stream流 + toMap

根据学生的name去重,原理:

        1、首先使用Stream API对list进行转换成流,使用Collectors.toMap方法将对象流转换为 Map,其中键是 name 字段,值是对象本身。当遇到重复的键时,我们使用合并函数 (p1, p2) -> p1 来选择保留哪个值;

        2、然后通过提取 Map 的值集合,我们获得了去重后的结果。将集合转换成List集合;

用普通的list对象来操作需要分为两步操作,这里我们使用了Stream API来操作,不需要写繁琐的for循环,更加简洁高效。注意Map集合是无序的,所以最后打印的结果是无序的。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(1, "张三", 13));list.add(new Student(2, "李四", 14));list.add(new Student(3, "张三", 15));list.add(new Student(4, "王五", 16));list.add(new Student(5, "李四", 17));List<Student> distinctList = list.stream().collect(Collectors.toMap(Student::getName, Function.identity(), (p1, p2) -> p1)).values().stream().collect(Collectors.toList());System.out.println(distinctList);}
}

三、重写equals和hashCode

Student类在原来的基础上,重写equals和hashCode,根据学生的name去重

import java.util.Objects;
import lombok.Data;@Data
public class Student {public Student(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}private Integer id;private String name;private Integer age;// 重写 equals 和 hashCode 方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name);}
}
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List<Student> list = new ArrayList<>();list.add(new Student(1, "张三", 13));list.add(new Student(2, "李四", 14));list.add(new Student(3, "张三", 15));list.add(new Student(4, "王五", 16));list.add(new Student(5, "李四", 17));List<Student> distinctList = list.stream().distinct().collect(Collectors.toList());System.out.println(distinctList);}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/627616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是DNS(域名系统)

域名系统&#xff08;DNS&#xff09;像是互联网的电话簿&#xff0c;将人们容易记住的网址转换成计算机能理解的IP地址。 没有DNS&#xff0c;我们就需要记住复杂的数字序列来访问网站 DNS的基本概念 定义&#xff1a;DNS是一个分布式数据库&#xff0c;它将域名&#xff08…

阿里云服务器ECS性能与优势,为什么国内第一云?

为什么选择阿里云&#xff1f;阿里云服务器有哪些优势&#xff1f;阿里云全球第三&#xff0c;国内第一云&#xff0c;阿里云服务器网aliyunfuwuqi.com分享云服务器ECS在丰富ECS实例架构、弹性灵活、稳定可靠、便捷易用、安全保障和成本优化多方面优势&#xff1a; 阿里云服务…

BSP-D2000平台调试CM9434串口芯片

1.硬件原理图 原理图显示两块9434的INT分别接到D2000的GPIO0_A3和GPIO0_A5. 2.配置 2.1 设备树 gpio <&pio 1 1 1 1 1 0>;| | | | | | | || | | | | | | ------表示有效电平| | | | | | | | | …

pyqt5写一个文本处理软件

参考资料https://www.zhihu.com/column/pyqt5 导入安装包 pip install PyQt5 -i https://pypi.douban.com/simple pip install PyQt5-tools -i https://pypi.douban.com/simplepyqt5 designer 如何将生成的UI文件转化为py代码 pyuic5 main.ui -o main.py好的&#xff0c;下…

cf-913-div3

title: cf 913 div3 date: 2024-01-16 16:42:45 tags: vp categories: 比赛 A. Rook 题目大意 可以在棋盘上横向或纵向移动任意步数&#xff0c;找出车的所有走法 解题思路 直接输出横向和纵向车能移动的位置即可 代码实现 void solve() {string s; cin >> s;string …

走迷宫之推箱子

前言&#xff1a; 在上一篇文章当中我介绍了一个走迷宫的写法&#xff0c;但是那个迷宫没什么可玩性和趣味性&#xff0c;所以我打算在迷宫的基础上加上一个推箱子&#xff0c;使之有更好的操作空间&#xff0c;从而增强了游戏的可玩性和趣味性。 1. 打印菜单 void menu() {…

探索 Python:发现有趣的库——第 1 章:数据可视化之旅

在一个充满活力的科技世界中&#xff0c;数据分析专家“算法仙”和编程爱好者“代码侠”相遇了&#xff0c;决定一起踏上数据可视化的探险之旅。他们将运用 Matplotlib 和 Seaborn 这两个强大的 Python 库&#xff0c;将枯燥的数据转化为生动的图形。 算法仙&#xff1a;你好&…

为什么要进行数模转换,数模转换的应用场景有哪些?

问题描述&#xff1a;为什么要进行数模转换&#xff0c;数模转换的应用场景有哪些&#xff1f; 问题解答&#xff1a; 数模转换&#xff08;Digital-to-Analog Conversion&#xff0c;简称DAC&#xff09;是将数字信号转换为模拟信号的过程。进行数模转换的原因和一些应用场景…

Kafka 的 Consumer Group 解读

作为一份笔记&#xff0c;本文再次梳理一下 Kafka 的 Consumer Group。我们知道&#xff0c;一个 Topic 往往会有多个 Partition&#xff0c;一条消息只会被写到一个 Kafka 的 Partition 中&#xff0c;那 Consumer 是怎么消费 Message 的呢&#xff1f; Consumer Group 又从中…

如何低成本打造高效跨国企业内网

随着企业数字化转型的加速&#xff0c;企业对网络连接、安全性和可靠性的需求也变得越来越高&#xff0c;最近小编收到了好几封私信&#xff0c;咨询跨境企业内部组网方案。 投稿的是某跨国公司的IT运维人员&#xff0c;总部在海外&#xff0c;国内分支机构每天都需要进行数据互…

【ASP.NET Core 基础知识】--中间件--什么是中间件

本篇文章作为中间件单元的开篇文章&#xff0c;通过这篇文章可以了解什么是中间件、内置中间件的使用以及怎么创建自定义中间件。我们先来看一下中间件的角色、目的和重要性。 1. 角色 请求处理管道的构建块&#xff1a; 中间件是构成ASP.NET Core请求处理管道的基本组成部分…

[Android]实现一个权限申请类

[Android]实现一个权限申请类 导言 在引入了动态权限申请之后&#xff0c;Android的权限申请就变得尤为繁琐&#xff0c;若是按照原有的方法一板一眼地进行申请&#xff0c;样板代码未免太多。因此本篇文章就使用ActivityResult API&#xff0c;来实现一个简单的权限申请类来帮…

C练习——魔术师猜三位数

题目&#xff1a; 有一种室内互动游戏&#xff0c;魔术师要每位观众心里想一个三位数abc&#xff08;a、b、c分别是百位、十位和个位数字&#xff09;&#xff0c;然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及这5个数的和值。只要观众说出这个和是多少&#xf…

设计模式之多线程分工模式--- 生产-消费者模式

系列文章目录 设计模式之避免共享的设计模式Immutability&#xff08;不变性&#xff09;模式 设计模式之并发特定场景下的设计模式 Two-phase Termination&#xff08;两阶段终止&#xff09;模式 设计模式之避免共享的设计模式Copy-on-Write模式 设计模式之避免共享的设计模…

Linux定时删除n天前的数据

Linux定时删除n天前的数据 1.创建删除脚本并授权 touch /home/data/script/shell/auto-del-60-days-ago-log.sh chmod x auto-del-60-days-ago-log.sh 2.编写shell脚本&#xff08;auto-del-60-days-ago-log.sh&#xff09; vi auto-del-60-days-ago-log.sh 添加如下内容&a…

Golang 替换数字卡码54题

文章目录 替换数字 54卡码网直接操作读取的[]byte 替换数字 54卡码网 本题为卡码网的54题&#xff0c;起为acm模式的答题 这里我们不在输入获得的[]byte类型上直接修改&#xff0c;而是保存在新建的[]byte上 golang小知识&#xff1a; 单引号’&#xff0c;表示byte类型或rune…

进程的创建与回收学习笔记

目录 一、进程内容&#xff1a; 二、进程常用命令 三、创建子进程 四、子进程进阶 五、进程的退出 六、进程的回收 一、进程内容&#xff1a; 程序&#xff1a; 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程&#xff1a; 执行一个程序所…

Image Sensor常见分辨率下HTS,VTS设置

本文介绍Image Sensor常见分辨率下HTS&#xff0c;VTS设置。 Image Sensor的HTS&#xff0c;VTS设置非常重要&#xff0c;其与Pixel Clock和FPS有一定的相关性&#xff0c;本文列出常见的分辨率下HTS&#xff0c;VTS的设置。 常见的分辨率下HTS&#xff0c;VTS的设置如下表。…

拍照后的相机logo怎么去掉?看完你就知道了

在日常生活中&#xff0c;拍照已经成为了我们捕捉美好瞬间的习惯。山川湖海、花鸟鱼虫&#xff0c;城市风光、街角趣闻&#xff0c;我们都喜欢用相机或手机留住这些美好的回忆。然而&#xff0c;有时候&#xff0c;当我们按下的那一刹那&#xff0c;一些不速之客——logo&#…

SQL语句详解五-DCL(数据控制语言)

文章目录 DCL管理用户示例代码 权限管理示例代码用户权限 DCL 概述&#xff1a;DCL&#xff0c;数据库控制语言&#xff0c;用来管理用户和给用户授予权限的 管理用户 添加用户 CREATE USER 用户名主机名 IDENTIFIED BY 密码;删除用户 DROP USER 用户名主机名;修改用户密码 S…