java stream distinct() 按指定对象属性进行去重

2023-10-30

方式一
distinct()不提供按照属性对对象列表进行去重的直接实现。它是基于hashCode()和equals()工作的。如果我们想要按照对象的属性,对对象列表进行去重,我们可以通过其它方法来实现



public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
  

使用方法:用Stream接口的 filter()接收为参数

List<Entity> lists = list.stream().filter(distinctByKey(b->b.getTid())).collect(Collectors.toList());

方式二
存在重复数据的问题,这里使用stream流的衍生功能,去除一个对象中的部分元素的重复如下:


ArrayList<ProductProcessDrawbackDto> collect = records1.stream().collect(Collectors.collectingAndThen(
                        Collectors.toCollection(() -> new TreeSet<>(
                                Comparator.comparing(
                                        ProductProcessDrawbackDto::getId))), ArrayList::new));

其中records1是处理的对象,改对象的list集合,collect是处理后返回的结果

其中的ProductProcessDrawbackDto是处理的list中每一个对象,id是判断是否重复的条件(去除id相同的重复元素,只保留一条)

多个字段或者多个条件去重

 ArrayList<PatentDto> collect1 = patentDtoList.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(() -> new TreeSet<>(
                        Comparator.comparing(p->p.getPatentName() + ";" + p.getLevel()))), ArrayList::new)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java stream distinct() 按指定对象属性进行去重 的相关文章

随机推荐

  • 上海市“星光计划”职业院校技能大赛 网络安全竞赛试题任务书

    2023上海市 星光计划 职业院校技能大赛 网络安全竞赛试题任务书 2023上海市 星光计划 职业院校技能大赛 网络安全竞赛试题任务书 A模块基础设施设置 安全加固 200分 A 1 登录安全加固 A 2 Web安全加固 Web A 3 流
  • linux2.4内核模块隐藏,Linux环境下的高级隐藏技术

    摘要 本文深入分析了Linux环境下文件 进程及模块的高级隐藏技术 其中包括 Linux可卸载模块编程技术 修改内存映象直接对系统调用进行修改技术 通过虚拟文件系统proc隐藏特定进程的技术 隐藏技术在计算机系统安全中应用十分广泛 尤其是在
  • 学习笔记 JavaScript ES6 Reflect

    学习内容 将Object属于语言内部的方法放到Reflect上 修改某些Object方法的返回结果 让其变得更合理 让Object操作变成函数行为 Reflect对象的方法与Proxy对象的方法相辅相成 将Object属于语言内部的方法放到
  • Jenkins + 云效 前后端项目自动化部署

    环境安装 创建目录 后续下载的内容 放在里边方便管理 cd mkdir docker cd docker mkdir maven mkdir jenkins mkdir java mkdir registry 宝塔 不在赘述 前往官网有安装
  • 爬取数据是违法的吗_网络爬虫违法吗?

    Web爬取 也称为Web抓取 数据抓取或爬虫 是一种计算机程序技术 用于从网站上抓取大量数据 并将其处理为结构化数据 Web抓取是常用的 基本上 网页抓取是互联网的功能 例如 SEO需要创建站点地图并授予其权限 让Google对其网站进行抓
  • R learning 十八讲 0018-R语言绘图基础

    0018 R语言绘图基础 2020 07 29更新 使用代码块 看起来更方便 更改了第6节 这次不介绍如ggplot2等绘图包 只记录一些R基础就能实现的东西 跟着我爪子敲一遍 相信你会有收获 有用的话请点赞收藏 O 嗷 能点个大大的关注就
  • vue2中使用axios,以及axios拦截器的配置

    目录 一 vue2项目中如何实现异步请求 1 axios 是一个基于Promise的网络请求库 既可以在node js 服务器端 使用 也可以在浏览器端使用 2 vue中的使用方法 2 引用方法 A 原生的方式 不推荐使用 B 在项目的ma
  • 猿创征文|小而巧的API文档生成工具之smart-doc

    文章目录 smart doc介绍 smart doc特性 smart doc的最佳搭档 谁在使用smart doc smart doc的优缺点 smart doc和swagger区别比较 smart doc的使用姿势 姿势一 姿势二 姿势三
  • Sqli-labs 查看源代码 1-20

    Less 1 indexphp sqli connectphp db credsinc GET 基于错误 单引号 字符型 Less 2 GET 基于错误 整型 Less 3 基于错误 单引号变形 字符型 Less 4 基于错误 双引号 字符
  • h5页面 3d效果 淘宝造物节

    js的视觉差引擎库 parallax js css 3d 引擎 css3d engine
  • STM32之GPIO引脚控制拉高拉低

    STM32之GPIO引脚控制拉高拉低 1 时钟启用 RCC APB2PeriphClockCmd RCC APB2Periph GPIOC ENABLE 2 结构体的初始化 typedef struct uint16 t GPIO Pin
  • Linux系统下安装、配置Apache(httpd)服务

    Linux系统下安装 配置Apache httpd 服务 前言 要在Linux服务器中配置并能够访问前端页面的方式有很多 包括搭建Tomcat Nginx静态服务器等 但是因为我们的前端之前也一直用的是Httpd的这种方式 正好有机会我装了
  • 关于开关软起动(缓启动)电路学习笔记

    软启动电路学习 目的 当电源输入di dt过大时 上电瞬间的浪涌电流就会越大 系统可靠性降低 特别是大功率系统需要考虑 措施 可以从增加阻抗去增长电流增长时间 电流沿变缓 这样会带来新的问题 阻抗过大 后级负载的电流能力下降 功率下降 所以
  • makefile运行时报错误1的一种解决办法

    错误1是语法错误 但是当结果为空时也会报错误1 例如 make test cat etc passwd grep administrator make test 错误 1 这时需要在后面加入判断就可以解决问题了 make test cat
  • UniApp原生讯飞语音插件-YL-SpeechRecognition

    插件说明 最新版插件已支持IOS 由于讯飞官方限制 appid和sdk必须对应 所以使用该插件只替换下自己的appid是不行的 需要联系本人 使用你提供的sdk为你打离线包 由于插件已支持安卓和ios双端 所以总体价格有所上涨 考虑到部分同
  • JEXL表达式引擎的使用

    简单介绍 JEXL的全称是Java表达式语言 Java Expression Language 简单的说 它可以配合我们的Java程序运算一些简单的表达式 由于近期的项目的中用到了 所以记录一下它的使用方法 很简单 具体可以识别哪些表达式
  • 解决:libpython2.7.so.1.0: cannot open shared object file: No such file or directory

    全局搜索libpython2 7 so 1 0 find name libpython2 7 so 1 0 在ld so conf中添加 usr local lib vi etc ld so conf cd 到 usr local lib
  • Java并发编程学习12-任务取消(上)

    任务取消 上 任务取消 由于篇幅较多 拆分了两篇来介绍各种实现取消和中断的机制 以及如何编写任务和服务 使它们能对取消请求做出响应 如何理解任务是可取消的 如果外部代码能在某个任务正常完成之前将其置入 完成 状态 那么这个任务就被认为是可取
  • Linux之远程拷贝命令

    当初用这个命令是因为用电脑远程登录了树莓派 然后用摄像头拍了一段视频 结果你知道树莓派的视频播放解码能力很差 卡出翔来 所以就想把拍得的视频拷贝到host端 具体做法是怎么样的呢 要实现这个功能就要使用Linux的scp scp就是secu
  • java stream distinct() 按指定对象属性进行去重

    方式一 distinct 不提供按照属性对对象列表进行去重的直接实现 它是基于hashCode 和equals 工作的 如果我们想要按照对象的属性 对对象列表进行去重 我们可以通过其它方法来实现 public static