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

java实用小技巧:判断list是否有重复项

在项目中经常会遇到这样的场景,就是一个list,根据某种规则,我要去判断里面是不是有重复的项。

难度不高,但有点烦,所以专门开一篇文章来记录一下,争取弄一个相对简洁的写法。

先看一个简单的例子:

//有一个list,里面是long类型的数字集合
List<Long> numbers = new ArrayList<>();
numbers.add(1L);
numbers.add(2L);
numbers.add(2L);
numbers.add(3L);
numbers.add(4L);
numbers.add(5L);//判断里面是否有重复
DistinctUtil util = new DistinctUtil();
System.out.println(util.distinctList(numbers).size() == numbers.size());
DistinctUtil是另外写的一个工具类,以下是distinctList方法:
public List<T> distinctList(List<T> rawList) {return rawList.stream().map(item -> item).distinct().collect(Collectors.toList());
}

 这是一个泛型方法 `distinctList`,它接受一个 `List` 类型的参数 `rawList`,返回一个经过去重处理的 `List`。 具体来说,该方法使用 Java 8 中的 Stream API 来对 `rawList` 进行操作。

首先,使用 `stream()` 把 `rawList` 转换为一个 `Stream`。然后,我们用map方法对每个元素进行了一个映射,就是把元素本身映射为元素本身,这一步看似无意义,但其实它是为了强制把 List 转化为 Stream。

接下来,在数据流中使用 `distinct()` 去重,最后用 `collect(Collectors.toList())` 方法把处理后的数据流转换为 `List` 类型并返回。

因为numbers是有重复元素的,所以结果是false。

进一步优化,如果的复杂类型怎么办呢?

比如有一个User类:

@Data
@Builder
public class User {String name;Integer age;
}

我要根据姓名是否有重复来判断,就得修改一下逻辑。

public List<T> distinctComplexList(List<T> rawList, Function<? super T,?> mapLogic) {return (List<T>) rawList.stream().map(item -> mapLogic.apply(item)).distinct().collect(Collectors.toList());
}

这个方法可以用来从一个包含复杂元素的列表中提取指定属性,去重并返回新列表。 该方法接收两个参数:原始列表 `rawList` 和用于提取指定属性的函数接口 `mapLogic`。该方法使用 Java 8 的 Stream API 处理原始列表,首先使用 `map()` 方法对每个元素进行属性提取,然后使用 `distinct()` 方法去重,最后使用 `collect()` 方法将 Stream 转换为列表并返回。

测试

//判断里面是否有重复
DistinctUtil<User> util = new DistinctUtil();List<User> users = Arrays.asList(User.builder().name("鲁班七号").age(10).build(),User.builder().name("鲁班七号").age(10).build(),User.builder().name("安其拉").age(10).build()
);Function<User, String> getName = User::getName;
System.out.println(util.distinctComplexList(users, User::getName ).size() == users.size());

注意,使用DistinctUtil的时候,一定要加泛型,不然User::getName的使用会有问题,会报一个Non-static method cannot be referenced from a static context的错误。

对应的,可以再封装两个判断是否重复的方法:

public boolean isRepeat(List<T> rawList){return distinctList(rawList).size() < rawList.size();
}public boolean isRepeat(List<T> rawList, Function<? super T,?> mapLogic){return distinctList(rawList).size() < rawList.size();
}

现在还有个问题,每次用这个工具类,还得先new出一个对象来,有点麻烦。

我之前试过,方法如果加了static,就不能用T了。其实这并不是说静态方法不能用类的泛型参数,而是如果你要用类的泛型参数,这个方法也得是泛型方法。

举个栗子:

public static <T>  List<T> distinctList(List<T> rawList) {return rawList.stream().map(item -> item).distinct().collect(Collectors.toList());
}

搞定了。

本文主要就是做一个记录,我是jdk1.7的忠实粉丝,lamda表达式用起来还是有点磕磕绊绊,后面要加油了。 

相关文章:

java实用小技巧:判断list是否有重复项

在项目中经常会遇到这样的场景&#xff0c;就是一个list&#xff0c;根据某种规则&#xff0c;我要去判断里面是不是有重复的项。 难度不高&#xff0c;但有点烦&#xff0c;所以专门开一篇文章来记录一下&#xff0c;争取弄一个相对简洁的写法。 先看一个简单的例子&#xf…...

SQL优化常用招数(上)

文章目录 一、查询SQL尽量不要使用select *,而是具体字段二、避免在where子句中使用 or 来连接条件三、尽量使用数值替代字符串类型四、使用varchar代替char五、技术延伸,char与varchar2的区别?六、where中使用默认值代替null七、避免在where子句中使用!=或<>操作符八…...

C++并发之探索编程三

文章目录1. 等待事件或等待其他条件1.1 凭借条件变量等待条件成立1.1.1 std::condition_variable1.1.2 std::condition_variable_any1.1.3 std::condition_variable和std::condition_variable_any之间的区别上个章节我们讨论了如何对共享数据的一个保护&#xff0c;通过std::lo…...

某智能驾驶企业:CACTER云网关为O365系统护航

01 客户背景 某智能驾驶企业是一家国际性的高科技创新型企业&#xff0c;在智能驾驶领域处于全球领先地位&#xff0c;专注于为广大客户提供个性化的智能驾驶解决方案&#xff0c;共建美好智能新时代。 使用产品&#xff1a;CACTER邮件安全云网关 02 痛点难点问题 根据Corema…...

网络安全与信息安全的主要区别讲解-行云管家

生活中工作中&#xff0c;我们经常可以听到信息安全与网络安全这两个词语&#xff0c;但很多小伙伴对于两者区分不清楚&#xff0c;今天我们小编就给大家来简单讲解一下这两者的主要区别吧&#xff01; 网络安全与信息安全的主要区别讲解 1、定义不同 网络安全是指网络系统的…...

Zabbix6.2利用模板和自定义监控项监控华为AR3260路由器

1&#xff1a;登录路由器的WEB管理控制台。在系统管理中找到SNMP然后开启SNMP代理&#xff0c;SNMP的版本可以只选择v2c都选择也无所谓&#xff0c;然后点击新建一个团体。 2&#xff1a;团体名称输入默认的public即可&#xff0c;在WEB端显示的是乱码&#xff0c;但是不影响使…...

MySQL Connector/C++使用过程中的问题

Linux环境下&#xff0c;使用mysql connector cpp的时候&#xff0c;链接的时候报错&#xff1a; /usr/bin/ld: warning: libssl.so.10, needed by /usr/lib64/libssh2.so.1, may conflict with libssl.so.1.1 /usr/bin/ld: ext/openssl/.libs/xp_ssl.o: undefined reference …...

SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法(内含源代码)

SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87549575 目录SpringBoot下的Spring——DAY0…...

Spark MLlib概述

Spark MLlib概述机器学习房价预测模型选型数据探索数据提取准备训练样本模型训练模型效果评估机器学习 机器学习的过程 : 基于历史数据&#xff0c;机器会根据一定的算法&#xff0c;尝试从历史数据中挖掘并捕捉出一般规律再把找到的规律应用到新产生的数据中&#xff0c;从而…...

Git 命令行5步解决冲突方法(亲测有效)

总体步骤如下&#xff1a; git pull --rebase 解决冲突文件 file1.c。git add file1.cgit commit -m "*****" git pushgit rebase --continue &#xff0c;此时冲突消失强推&#xff0c;git push origin xxxx -f 本人解决的例子如下&#xff1a; 第一步、拉取…...

在线帮助文档——让用户更方便地获取帮助

在当今互联网时代&#xff0c;人们在使用各种产品或服务时&#xff0c;难免会遇到问题或疑问&#xff0c;需要寻求帮助。而在线帮助文档则成为了一种方便、快捷、高效的解决问题的方式。Baklib作为一款优雅的云知识库构建平台&#xff0c;可以帮助公司在线制作各种类型的帮助文…...

一小时轻松掌握Git,看这一篇就足够

文章目录序言&#xff1a;版本控制分类一、Git环境配置下载卸载安装二、常用linux命令三、基本配置四、Git基本操作0.原理图1.项目创建及克隆方式一&#xff1a;本地仓库搭建方式二&#xff1a;克隆远程仓库2.文件操作3.配置ssh公钥4.分支5.push代码参考序言&#xff1a;版本控…...

spring cloud stream 自定义binder

背景xxx,关键字 binder stream &#xff0c;解决多中间件通信及切换问题直接主菜&#xff1a;spring cloud stream 架构中间件 --- binder --- channel --- sink --- &#xff08;处理&#xff09;---source ---channel ---binder ---中间件 springcloudstream已自己集成了kafk…...

计算机网络之HTTP协议

目录 一、HTTP的含义 1.1 理解超文本 1.2 理解应用层协议 1.3 理解HTTP协议的工作过程 二、HTTP协议格式 2.1 抓包工具的使用 2.2 理解协议格式 2.2.1 请求协议格式 2.2.2. 响应格式请求 一、HTTP的含义 HTTP&#xff08;全称为“超文本传输协议”&#xff09;&#x…...

如何挖掘专利创新点?

“无意中发现了一个巨牛的人工智能教程&#xff0c;忍不住分享一下给大家。教程不仅是零基础&#xff0c;通俗易懂&#xff0c;而且非常风趣幽默&#xff0c;像看小说一样&#xff01;觉得太牛了&#xff0c;所以分享给大家。点这里可以跳转到教程。” 对于广大的软件工程师来说…...

虚函数和纯虚函数

多态&#xff08;polymorphism&#xff09;是面向对象编程语言的一大特点&#xff0c;而虚函数是实现多态的机制。其核心理念就是通过基类访问派生类定义的函数。多态性使得程序调用的函数是在运行时动态确定的&#xff0c;而不是在编译时静态确定的。使用一个基类类型的指针或…...

Framework源码面试——Handler与事件传递机制面试集合

Handler面试题 Handler的作用&#xff1a; 当我们需要在子线程处理耗时的操作&#xff08;例如访问网络&#xff0c;数据库的操作&#xff09;&#xff0c;而当耗时的操作完成后&#xff0c;需要更新UI&#xff0c;这就需要使用Handler来处理&#xff0c;因为子线程不能做更新…...

iOS开发-bugly符号表自动上传发布自动化shell

这里介绍的是通过build得到的app文件和dSYM文件来打包分发和符号表上传。 通过Archive方式打包和获得符号表的方式以后再说。 一&#xff1a;bugly工具jar包准备 bugly符号表工具下载地址&#xff1a;(下载完成后放入项目目录下&#xff0c;如不想加入git可通过gitIgnore忽略…...

MySQL OCP888题解046-哪些语句会被记录到binlog

文章目录1、原题1.1、英文原题1.2、中文翻译1.3、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3.1、知识点1&#xff1a;binlog_format选项3.2、知识点2&#xff1a;Performance Schema(性能模式)4、总结1、原题 1.1、英文原题 You enable binary logging on MySQL S…...

【前端学习】D5:CSS进阶

文章目录前言系列文章目录1 精灵图Sprites1.1 为什么需要精灵图&#xff1f;1.2 精灵图的使用2 字体图标iconfont2.1 字体图标的产生2.2 字体图标的优点2.3 字体文件格式2.4 字体图标的使用2.5 字体图标的引入2.6 字体图标的追加3 CSS三角3.1 普通三角3.2 案例4 CSS用户界面样式…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...