Java之stream流去重,单字段,多字段都可
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流去重,单字段,多字段都可相关推荐
- 函数式编程(JAVA)——Stream流
函数式编程(JAVA)--Stream流 概述 Java8的Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或数组进行链状流式的操作.可以更方便的让我们对集合或数组操作. 下述 ...
- 对比Java的Stream流和C# 的Linq
Java由于没有委托的概念,所以用函数式接口 @FunctionalInterface 与 lambda表达式相结合,实现了类似于C# 中委托,C++中函数指针的功能. 函数指针/委托在Java中被命 ...
- Java 8 Stream 流用法及语法
Java 8 Stream 流用法 1.简介 Stream流 最全的用法 Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据 ...
- Java 8 Stream流 的用法
Java 8 Stream流 什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需 ...
- Java 8 - Stream流骚操作解读2_归约操作
文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...
- Java 8 - Stream流骚操作解读
文章目录 分类 中间操作 终端操作 使用Stream流 筛选和切片 用谓词筛选 filter 筛选各异的元素 distinct 截短流 limit 跳过元素 skip 映射 对流中每一个元素应用函数 ...
- JAVA的stream流操作详细解析
java的stram流操作 为什么需要 Stream 流与集合的区别 对比:原始集合操作与Stream集合操作 (过滤/映射/扁平化/遍历/排序/去重/跳过/截断的应用) 流的组成 流操作的分类 流的 ...
- Java 8 Stream流的常见操作
Stream流的使用 在 Java 8 中, 集合接口有两个方法来生成流: stream() − 为集合创建串行流.parallelStream() − 为集合创建并行流. 串行流 如果是数组的话,可 ...
- 吃透JAVA的Stream流操作,多年实践总结
在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理. 例如,现在有这么一个需求: 从给定句子中返回单词 ...
最新文章
- SARscape_5.2.0和SARscape_5.2.1安装包下载
- 7个鲜为人知却超实用的PHP函数
- 《背影》——朱自清(目录导航测试)
- 自定义EventSource(二)PollingCounter
- udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?
- mysql 编译安装与rpm安装的区别_编译安装与RPM安装的区别
- Controller @Autowired注解 无法注入值为null的问题
- 一种验证Linux kernel是否可用的Sanity Check方法
- amoeba实现mysql主从读写分离_利用Amoeba实现MySQL主从复制和读写分离
- 2019 vs 安装odt_河南2019二级造价师考试教材出版信息,免费送考试大纲
- java中日期做减法_Java中日期的加法和减法
- 当浏览器版本过低时提示升级浏览器
- python绘制国际象棋规则口诀_学好国际象棋必须知道的小口诀技巧
- 华为三层交换机配置方法实例
- 正版软件汇集,遥感集市
- 关于修改思科WLC SSID
- JAVA-输出一个三角形(详解)
- 无法被局域网计算机访问,在一个局域网中,一台电脑不能被其他电脑访问为什么?如题 谢谢了...
- 前端代理解决跨域问题
- 【数据挖掘导论】对于决策树要掌握的几个问题