1.封装工具类

public class DeduplicationUtil {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;}
}

2.简易学生对象

//偷懒用了lombok,自动生成getter和setter以及构造函数
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {private String id_;private String name_;
}

3.使用junit测试

public class DemoTest {@Testpublic void test(){Student student1 = new Student("1","aaa");Student student2 = new Student("1","bbb");Student student3 = new Student("1","ccc");Student student4 = new Student("2","ccc");ArrayList<Student> list = new ArrayList<>();list.add(student1);list.add(student2);list.add(student3);list.add(student4);//使用封装方法的多字段List<Student> collect = list.stream().filter(DeduplicationUtil.distinctByKey(s -> s.getId_() + ";" + s.getName_())).collect(Collectors.toList());System.out.println(collect);//多字段TreeSetArrayList<Student> collect1 = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(s->s.getId_() + ";" + s.getName_()))), ArrayList::new));System.out.println(collect1);}
}

单字段只要get一个不拼接即可,和distinct()方法区别是不需要重写hashcode以及equal方法,这样可以避免一些问题因为这些去重不完整。

参考文章:

https://blog.csdn.net/Kurry4ever_/article/details/109638367
https://www.jianshu.com/p/b1362370c77d
https://haiyoung.blog.csdn.net/article/details/80934467
https://blog.csdn.net/yojofly/article/details/100986216

Java之stream流去重,单字段,多字段都可相关推荐

  1. 函数式编程(JAVA)——Stream流

    函数式编程(JAVA)--Stream流 概述 Java8的Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或数组进行链状流式的操作.可以更方便的让我们对集合或数组操作. 下述 ...

  2. 对比Java的Stream流和C# 的Linq

    Java由于没有委托的概念,所以用函数式接口 @FunctionalInterface 与 lambda表达式相结合,实现了类似于C# 中委托,C++中函数指针的功能. 函数指针/委托在Java中被命 ...

  3. Java 8 Stream 流用法及语法

    Java 8 Stream 流用法 1.简介 Stream流 最全的用法 Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据 ...

  4. Java 8 Stream流 的用法

    Java 8 Stream流 什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需 ...

  5. Java 8 - Stream流骚操作解读2_归约操作

    文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...

  6. Java 8 - Stream流骚操作解读

    文章目录 分类 中间操作 终端操作 使用Stream流 筛选和切片 用谓词筛选 filter 筛选各异的元素 distinct 截短流 limit 跳过元素 skip 映射 对流中每一个元素应用函数 ...

  7. JAVA的stream流操作详细解析

    java的stram流操作 为什么需要 Stream 流与集合的区别 对比:原始集合操作与Stream集合操作 (过滤/映射/扁平化/遍历/排序/去重/跳过/截断的应用) 流的组成 流操作的分类 流的 ...

  8. Java 8 Stream流的常见操作

    Stream流的使用 在 Java 8 中, 集合接口有两个方法来生成流: stream() − 为集合创建串行流.parallelStream() − 为集合创建并行流. 串行流 如果是数组的话,可 ...

  9. 吃透JAVA的Stream流操作,多年实践总结

    在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理. 例如,现在有这么一个需求: 从给定句子中返回单词 ...

最新文章

  1. SARscape_5.2.0和SARscape_5.2.1安装包下载
  2. 7个鲜为人知却超实用的PHP函数
  3. 《背影》——朱自清(目录导航测试)
  4. 自定义EventSource(二)PollingCounter
  5. udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?
  6. mysql 编译安装与rpm安装的区别_编译安装与RPM安装的区别
  7. Controller @Autowired注解 无法注入值为null的问题
  8. 一种验证Linux kernel是否可用的Sanity Check方法
  9. amoeba实现mysql主从读写分离_利用Amoeba实现MySQL主从复制和读写分离
  10. 2019 vs 安装odt_河南2019二级造价师考试教材出版信息,免费送考试大纲
  11. java中日期做减法_Java中日期的加法和减法
  12. 当浏览器版本过低时提示升级浏览器
  13. python绘制国际象棋规则口诀_学好国际象棋必须知道的小口诀技巧
  14. 华为三层交换机配置方法实例
  15. 正版软件汇集,遥感集市
  16. 关于修改思科WLC SSID
  17. JAVA-输出一个三角形(详解)
  18. 无法被局域网计算机访问,在一个局域网中,一台电脑不能被其他电脑访问为什么?如题 谢谢了...
  19. 前端代理解决跨域问题
  20. 【数据挖掘导论】对于决策树要掌握的几个问题

热门文章

  1. 比较好的Java 网站/论坛/博客集锦
  2. 怎么用计算机检测颜色的深浅,颜色的秘密:为何需要色彩分析仪测量颜色
  3. 荧光光谱仪行业调研报告 - 市场现状分析与发展前景预测
  4. 系统架构:系统分层和数据分层
  5. 冰河最新出版的《深入理解高并发编程:核心原理与案例实战》到底讲了些啥?(视频为证)
  6. CImage类的介绍与使用
  7. 计算机图学测试题及答,计算机图形学试卷
  8. CocosCreator多语言包的处理
  9. 【AR技术】AR教学机器人
  10. 单点登录SSO的原理和实现