Java8 stream 根据对象字段去重

2023-11-07

public class Java8StreamTest {

    public static class Book{

        private String id;

        private String name;

        public Book(String id, String name) {
            this.id = id;
            this.name = name;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Book{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
        }
    }

    @Test
    public void testUnique(){
        List<Book> books = Lists.newArrayList(new Book("1","1"),new Book("2","2"),new Book("3","3"),new Book("2","2"));

		//使用TreeSet去重
        List<Book> unique1 = books.stream().collect(
                collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getId()))),
                        ArrayList::new));

        System.out.println(unique1);

		//使用map去重
        List<Book> unique2 = books.stream()
                .filter(distinctByKey(o -> o.getId()))
                .collect(Collectors.toList());
        System.out.println(unique2);

    }

    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        System.out.println("这个函数将应用到每一个item");
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java8 stream 根据对象字段去重 的相关文章

随机推荐

  • 【游戏测试工程师】2023年4399秋招笔试+面试记录

    文章目录 一 笔试题 一 逻辑推理题 1 猜花色 2 猜岗位 二 游戏测试相关题 1 假如你要对一款手机游戏进行基本测试 问 一 你会做哪几个方面的测试 二 分别想怎么做 2 编写游戏测试用例 3 编写测试点 三 编程题 1 游戏竞技场 2
  • java swing GUI窗口美化

    一般我们写出的窗口是这个样子的 文本框和按钮都不是太美观 如果按钮是原色的就更难看了 今天发现了一个更加美观的窗口模式 可以发现按钮和文本框都已经有了变化 给窗口润色不少 其实 只需在调用程序前加上这段代码即可 try for javax
  • Atom+Asciidoctor+Antora环境搭建

    个人博客原文链接 Atom 简介 Atom是github专门为程序员推出的一个跨平台文本编辑器 具有简洁和直观的图形用户界面 并有很多有趣的特点 支持CSS HTML JavaScript等网页编程语言 它支持宏 自动完成分屏功能 集成了文
  • LeetCode——040

    40 Combination Sum II My Submissions QuestionEditorial Solution Total Accepted 66386 Total Submissions 241547 Difficulty
  • 搭建Mybatis注意事项和实现原理,你真的看懂了吗?

    搭建Mybatis环境注意事项 一 搭建Mybatis环境注意事项 二 涉及到的设计模式 2 1工厂模式 SqlSessionFactory 2 2 代理模式 MapperProxyFactory 2 3构建者模式 SqlSessionFa
  • openpyxl绘制堆叠图

    本文将会说明如何用openpyxl绘制堆叠图 先来看看效果图 数据处理后效果展示 源数据 老规矩源代码先放上后面再解析 使用时记得要改一下路径哦 先把openpyxl全家桶安排上 from openpyxl import load work
  • Python基础08

    Python基础08 学习08 方法没有重载 在其他语言中 可以定义多个重名的方法 只要保证方法标签名唯一即可 方法签名包含3个部分 方法名 参数数量 参数类型 Python中 方法的参数没有生命类型 调用时确定参数的类型 参数的数量也可以
  • hive文件存储格式:SequenceFile系统总结

    问题导读 1 什么是SequenceFile 2 如何 通过 源码实现SequenceFile压缩 3 SequenceFile格式压缩有什么优点和缺点 1 SequenceFile是什么1 1 SequenceFile概述 1 1 seq
  • mapGetters 辅助函数

    1 mapGetters 辅助函数 mapGetters 辅助函数 mapGetters 辅助函数仅仅将store 中的 getter 映射到局部计算属性 1 import mapGetters from vuex 2 export def
  • 列出一个文件夹下的所有文件名(全路径)

    需求 列出一个文件夹下的所有文件的全路径文件名 如果文件是文件夹 那么再次遍历这个文件夹的的所有文件名 直到遍历的文件不是文件夹为止 这时输出文件的全路径名 分析 可以用函数实现 1 函数参数1个 就是要遍历的文件夹的名字 2 遍历该文件夹
  • java垃圾回收机制详解

    文章目录 一 垃圾回收机制是什么 二 机制运行原理 三 机制运行步骤 一 垃圾回收机制是什么 Java的垃圾回收 Garbage Collection GC 机制是Java内存管理的核心部分 它可以自动回收不再被程序使用的内存空间 防止内存
  • Makefile 中:= ?= += =的区别

    在Makefile中我们经常看到 这几个赋值运算符 那么他们有什么区别呢 我们来做个简单的实验 新建一个Makefile 内容为 ifdef DEFINE VRE VRE Hello World else endif ifeq OPT de
  • 今天Chat GPT又胡说八道,看我如何纠正的

    今天想把python pydantic 转成markdown mermaid 就去问Chat GPT Chat GPT给出了如下答案 然后 我就打入命令安装 结果这个包根本就不存在 既然找不到 pydantic 转 mermaid 的工具
  • Docker 安装hadoop

    一 实验环境 实验设备 硬件 单核CPU 内存1G 软件 Ubuntu 16 04操作系统 Docker Hadoop 二 实验原理及内容 1 在Ubuntu系统中安装Docker Apt install docker 复制代码 Apt g
  • Kendo UI开发教程(9): Kendo UI Validator 概述

    Kendo UI Validator 支持了客户端校验的便捷方法 它基于HTML 5 的表单校验功能 支持很多内置的校验规则 同时也提供了自定义规则的便捷方法 完整的Kendo UI 的Validator可以参见API 文档 HTML 5
  • SQL优化

    1 应尽量避免在 where 子句中使用 或 lt gt 操作符 否则将引擎放弃使用索引而进行全表扫描 2 对查询进行优化 应尽量避免全表扫描 首先应考虑在 where 及 order by 涉及的列上建立索引 3 应尽量避免在 where
  • Java 集合 (Set, TreeSet, HashSet)

    目录 1 Set 2 TreeSet 2 1 自然排序 2 2 比较器排序 2 3 两种比较方式小结 3 HashSet 3 1 哈希值 3 2 底层原理 4 小结 1 Set Set 集合特点 可以去除重复 存取顺序不一致 没有带索引的方
  • 手机快充协议

    高通 QC2 0 QC3 0 QC3 5 QC4 0 QC5 0 FCP SCP AFC SFCP MTKPE1 1 PE2 0 PE3 0 TYPEC PD2 0 PD3 0 3 1 VOOC 支持 PD3 0 PD2 0 支持 QC3
  • UML用例图的作用、功能模块图作用与数据库设计三者关系

    这周周一 我们导师要求小组成员开会 我们分别汇报自己的工作 在会中 谈到了用例图 于是我们开始对大家熟悉的用例图进行探讨 经过探讨与自己的思考 我认为应该从以下几个问题来弄清楚用例图的作用 1 用例图由谁来做 为谁做 做完了有什么用途 用例
  • Java8 stream 根据对象字段去重

    public class Java8StreamTest public static class Book private String id private String name public Book String id String