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

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);}
}

 

相关文章:

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

项目场景&#xff1a; java stream distinct根据list某个字段去重&#xff0c;普通List简单去重&#xff1a; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;public class TestMain {public static void main(String[] args) {List&l…...

超精简虚拟机镜像

前经常有人问我要极度精简的win 7 虚拟机镜像&#xff0c;开个贴直接发吧&#xff0c;这次包括 win10 和 win7 镜像,另有一个 win 8 win7 镜像压缩包只有 300Mb&#xff0c; win 10 镜像 有 800Mb&#xff0c; win 8 有 700Mb 系统极度精简&#xff0c;可以运行 qq 微信&#…...

【JVM】常用命令

一、前言 Java虚拟机&#xff08;JVM&#xff09;是Java程序运行的基础设施&#xff0c;它负责将Java字节码转换为本地机器代码并执行。在开发过程中&#xff0c;我们经常需要使用一些命令来监控和管理JVM的性能和状态。本文将详细介绍6个常用的JVM命令&#xff1a;jps、jstat…...

第 7 章 排序算法

文章目录 7.1 排序算法的介绍7.3 算法的时间复杂度7.3.1 度量一个程序(算法)执行时间的两种方法7.3.2 时间频度7.3.3 时间复杂度7.3.4 常见的时间复杂度7.3.5 平均时间复杂度和最坏时间复杂度 7.4 算法的空间复杂度简介7.4.1 基本介绍 7.5 冒泡排序7.5.1 基本介绍7.5.2 演示冒泡…...

机器人持续学习基准LIBERO系列7——计算并可视化点云

0.前置 机器人持续学习基准LIBERO系列1——基本介绍与安装测试机器人持续学习基准LIBERO系列2——路径与基准基本信息机器人持续学习基准LIBERO系列3——相机画面可视化及单步移动更新机器人持续学习基准LIBERO系列4——robosuite最基本demo机器人持续学习基准LIBERO系列5——…...

基于 Level set 方法的医学图像分割

摘 要 医学图像分割是计算机辅助诊断系统设计中的关键技术。对于医学图像分割问题,它一般可分为两部分:(l)图像中特定目标区域(器官或组织)的识别;(2)目标区域完整性的描述与提取。相比于其他图像,医学图像的复杂性和多样性,使得传统的基于底层图像信息的分割方法很难取得好的…...

【C++入门】C++ STL中string常用函数用法总结

目录 前言 1. string使用 2. string的常见构造 3. string类对象的访问及遍历 迭代器遍历&#xff1a; 访问&#xff1a; 4. string类对象的容量操作 4.1 size和length 4.2 clear、empty和capacity 4.3 reserve和resize reserve resize 5. string类对象的修改操作 push_back o…...

Rust变量、常量声明与基本数据类型

Rust是一门系统级别的编程语言&#xff0c;注重安全性、性能和并发。在这篇博客中&#xff0c;我们将介绍Rust中的变量、常量声明以及基本数据类型&#xff0c;并通过示例说明每一种类型的用法。 变量声明 在Rust中&#xff0c;使用 let 关键字声明变量。变量默认是不可变的&…...

【MATLAB】 SSA奇异谱分析信号分解算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 SSA奇异谱分析&#xff08;Singular Spectrum Analysis&#xff09;是一种处理非线性时间序列数据的方法&#xff0c;可以对时间序列进行分析和预测。 它基于构造在时间序列上的特定矩阵的奇异值分解&#…...

Nginx+Tomcat负载均衡、动静分离以及Nginx负载均衡和四层代理

目录 NginxTomcat负载均衡、动静分离 Nginx 负载均衡模式&#xff1a; Nginx 四层代理配置&#xff1a; NginxTomcat负载均衡、动静分离 Nginx 服务器&#xff1a;192.168.80.10:80 Tomcat服务器1&#xff1a;192.168.80.100:80 Tomcat服务器2&#xff1a;192.168.80.101:80…...

Vue3中provide,inject使用

一&#xff0c;provide,inject使用&#xff1a; 应用场景&#xff1a;向孙组件传数据 应用Vue3碎片&#xff1a; ref&#xff0c;reactive&#xff0c;isRef&#xff0c;provide, inject 1.provide,inject使用 a.爷组件引入 import {ref,provide} from vue const drinkListre…...

Django命令模块

这篇文章我们主要来介绍一下关于 Django 的命令模块&#xff0c;我们经常会使用到&#xff0c;比如以下几个常用的命令&#xff0c;都属于 Django 的命令模块&#xff1a; python manage.py makemigrations python manage.py migrate python manage.py startapp python manage…...

【linux驱动开发】在linux内核中注册一个杂项设备与字符设备以及内核传参的详细教程

文章目录 注册杂项设备驱动模块传参注册字符设备 开发环境&#xff1a; windows ubuntu18.04 迅为rk3568开发板 注册杂项设备 相较于字符设备&#xff0c;杂项设备有以下两个优点: 节省主设备号:杂项设备的主设备号固定为 10&#xff0c;在系统中注册多个 misc 设备驱动时&…...

Golang条件编译 | 获取系统的磁盘空间内存占用demo | gopsutil/disk库(跨平台方案)

文章目录 一、Golang条件编译1. 构建标签( Build tags)2. 文件后缀&#xff08;File suffixes&#xff09; 二、GO golang 获取磁盘空间 条件编译思路 三、【推荐】使用github.com/shirou/gopsutil/disk这个库&#xff0c;如何获取机器下不同磁盘分区的内容 一、Golang条件编译…...

22/76-池化

池化&#xff08;最大池化层&#xff1a;选每个kernel中最大的数&#xff09; 填充、步幅、多个通道&#xff1a; 池化层与卷积层类似&#xff0c;都具有填充和步幅。 没有可学习的参数。 在每个输入通道应用池化层以获得相应的输出通道。 输出通道数输入通道数。 平均池化层…...

江科大STM32 下

目录 ADC数模转换器DMA直接存储器存取USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2C(mpu6050陀螺仪和加速度计)SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR1…...

利用HTML和CSS实现的浮动布局

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{m…...

2024年第十届控制、自动化与机器人国际会议(ICCAR 2024)即将召开!

2024年4月27~29日 新加披 会议官网&#xff1a;10th-ICCAR 2024https://iccar.org/index.html 第十届控制、自动化和机器人国际会议将于2024年4月27-29日在新加坡举办。本次会议由新加坡电子学会&#xff0c;IEEE机器人和自动控制协会和IEEE联合主办&#xff0c;并得到北京航空…...

基于python集成学习算法XGBoost农业数据可视化分析预测系统

文章目录 基于python集成学习算法XGBoost农业数据可视化分析预测系统一、项目简介二、开发环境三、项目技术四、功能结构五、功能实现模型构建封装类用于网格调参训练模型系统可视化数据请求接口模型评分 0.5*mse 六、系统实现七、总结 基于python集成学习算法XGBoost农业数据可…...

第29集《佛法修学概要》

丁三、声闻乘 分二&#xff1a;戊一、释义&#xff1b;戊二、四谛法&#xff1b;戊三、结示 请大家打开讲义第八十二页。我们看丁三&#xff0c;声闻乘。 在祖师大德的判教当中&#xff0c;把我们整个大乘的成佛之道分成了三个部分&#xff1a;第一个是安乐道&#xff0c;第…...

Veo生成模糊/断帧/色偏?立刻停用默认设置!20年视频架构师紧急发布的5项必改Veo 2K/4K硬核配置

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Veo 2K/4K视频生成质量崩塌的根源诊断 当Veo模型在2K或4K分辨率下输出视频时&#xff0c;高频细节严重丢失、运动伪影显著增强、纹理结构模糊化&#xff0c;这一现象并非单纯算力不足所致&#xff0c;而…...

【参数辨识】经典Prandtl–Ishlinskii(PI)迟滞模型及其PSO算法参数辨识【含Matlab源码 15544期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab领域博客之家&#x1f49e;&…...

Java 面向对象 - 触发类的初始化,执行其中的 static 块(包含不会触发初始化的情况)

触发类的初始化&#xff0c;执行其中的 static 块 访问 static 字段 public class SomeClass {static {System.out.println("static block executed");}public static int num 100; }int num SomeClass.num;访问 static 方法&#xff0c;可以使用空方法&#xff08…...

抖音批量下载工具:免费无水印下载完整指南

抖音批量下载工具&#xff1a;免费无水印下载完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量…...

Java应用CPU飙升到900%?这套排查套路让你10分钟定位根因

在这篇文章中&#xff0c;我将结合最近一次真实的生产事故&#xff0c;分享一套经过实战检验的CPU排查方法论。这不是教科书上那些”用jstack查看线程栈”的泛泛之谈&#xff0c;而是我们在72小时连续作战中总结出来的血泪经验。 一、告警响应该做什么&#xff1f;别急着重启&…...

为什么你的Veo 4K输出只有2K质量?深度拆解Veo 2.3引擎中的3层分辨率欺骗机制与绕过方案

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Veo 4K输出质量失真的现象确认与基准测试 近期多位专业视频工程师反馈&#xff0c;Veo系列编码器在启用4K60fps高码率输出时&#xff0c;出现肉眼可辨的色度抽样偏移、边缘锐度衰减及动态场景下的块效应增强。…...

低空飞行器降噪气动智能反向设计系统已融合人工智能AI软件平台

低空飞行器降噪气动智能反向设计大模型系统已融合人工智能AI软件平台一、系统概述本系统专为低空飞行器在城市低空飞行、近地通航及密集空域作业等场景量身打造。针对当前行业内气动噪声突出、降噪设计迭代缓慢、正向构型试错成本高昂、流噪耦合计算复杂以及合规降噪难度大等核…...

Layerdivider:用AI智能解构插画,让PSD图层分离变得轻而易举

Layerdivider&#xff1a;用AI智能解构插画&#xff0c;让PSD图层分离变得轻而易举 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 在数字艺术创作中&…...

哔哩下载姬:解锁B站视频下载的智能新方式

哔哩下载姬&#xff1a;解锁B站视频下载的智能新方式 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;。 项…...

如何在Windows上实现高效屏幕标注:gInk免费工具完全指南

如何在Windows上实现高效屏幕标注&#xff1a;gInk免费工具完全指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 你是否需要在演示时快速圈出重点&#xff0c;或在线…...