java8如何对List<Bean>进行去重和覆盖
背景:有一批数据源从kafka给过来,接收到后需要处理,然后入库,我们用一个线程消费下来,一次消费30000条,
按照对象的概念,可以用List<Person>来表示,因为某种原因,需要根据记录的主键personId先在内存做去重(覆盖)处理
在新特性之前,正常的思路会是:list转为map,key为personId,put的时候相同的personId后面的覆盖前面的
java8新特性中,对这种情形有优雅的处理方式,我们分两种:
(1)不关心覆盖逻辑,相同personId只留一条
public static List<Person> coverDuplicate(List<Person> sourceList) {
if (CollectionUtils.isEmpty(sourceList)) {
return new ArrayList<>();
}
List<Person> distinctList = sourceList.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(o -> o.getPersonId()))), ArrayList::new)
);
return distinctList;
}
(2)相同的personId,后面的记录要求覆盖前面的
public static List<Person> coverDuplicate1(List<Person> sourceList) {
if (CollectionUtils.isEmpty(sourceList)) {
return new ArrayList<>();
}
List<Person> distinctList = sourceList.stream().collect(
Collectors.toMap(Person::getPersonId, Function.identity(), (e1, e2) -> e2)
).values().stream().collect(Collectors.toList());
return distinctList;
}
测试用例:
public class Person{
private String personId;
private String name;
private Integer operateTag;
}
public static void main(String[] args) {
Person p1 = new Person("1","111",1);
Person p2 = new Person ("1","222",0);
Person p3 = new Person ("3","333",1);
Person p4 = new Person ("4","444",0);
Person p5 = new Person ("4","555",1);
List<Person > sourceList = new ArrayList<>();
sourceList.add(p1);
sourceList.add(p2);
sourceList.add(p3);
sourceList.add(p4);
sourceList.add(p5);
List<Person> unique = coverDuplicate(sourceList);
unique.forEach(e -> System.out.println(e.getPersonId()+","+e.getName()+","+e.getOperateTag())); }
两种方式,打印结果如预期
java8如何对List<Bean>进行去重和覆盖的更多相关文章
- Java8 根据对象某个属性值去重
list中的对象某个属性存在重复时将重复的对象去重 //根据skuAttrValueName值去重 List<SkuValue> uniqueSkuValues = skuValues.s ...
- Java8 list根据对象某个属性去重
1. 添加方法: import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import j ...
- Spring框架配置文件中有两个相同名字的bean,最后会覆盖掉一个bean
问题容易出现在多个人合作的项目中,定义bean的名字的时候发生重复. 可以配置当bean定义重复的时候抛出异常,结束程序,强制提示更改重复的bean.
- java8 常用代码
1. 使用java8 提取出 list 中 bean 的某一属性 public static void main(String[] args) { List<Student> stuLis ...
- Spring笔记 - Bean xml装配
命名空间表 aop Provides elements for declaring aspects and for automatically proxying @AspectJannotated c ...
- List去重问题与方法
面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固.我们大家都知道,set集合的特点就是没有重复的元素.如果集合中的数据类型是基本数 ...
- Java中5种List的去重方法及它们的效率对比,你用对了吗?
01.使用两个for循环实现List去重(有序) /**使用两个for循环实现List去重(有序) * * @param list * */ public static ...
- [spring源码学习]四、IOC源码——普通bean初始化
一.代码例子 此节开始涉及到一个bean具体生成和保存的过程,仅仅涉及到最简单的bean,代码依旧是最简单的 public static void main(String[] args) { Defa ...
- 【Spring源码解读】bean标签中的属性(二)你可能还不够了解的 abstract 属性和 parent 属性
abstract 属性说明 abstract 在java的语义里是代表抽象的意思,用来说明被修饰的类是抽象类.在Spring中bean标签里的 abstract 的含义其实也差不多,表示当前bean是 ...
随机推荐
- bash arithmatic
Arithmetic in bash is done with $ and double parentheses: echo "$(($num1+$num2))" Or $ and ...
- jupyter notebook的魔法命令 % %%
Magic单元分为两种,一种是line magics,另外一种cell magics. Line magic是通过在前面加%,表示magic只在本行有效. Cell magic是通过在前面加%%,表示 ...
- mac下jmeter的安装
1.下载jmeter for jmeter 自行网络下载,也可以在我提供的网盘中下载 jmeter3.3链接:https://pan.baidu.com/s/1AVhZjKmN9s7AOxfyONeB ...
- ssh远程连接控制 linux 口令、密钥连接
sshd服务提供两种安全验证的方法: 基于口令的安全验证:经过验证帐号与密码即可登陆到远程主机. 基于密钥的安全验证:需要在本地生成“密钥对”后将公钥传送至服务端,进行公共密钥的比较(相对安全). 首 ...
- 转 Jmeter业务请求比例
[转载]Jmeter业务请求比例1 ps:文章转自订阅号“测试那点事儿”,链接:https://mp.weixin.qq.com/s/qVD4iNO0QqRIwAIq9_E_Kw 方法二: 可 ...
- Myeclipse中dtd代码提示
1.Myeclipse -->窗口 --> 首选项 2.输入xml c,然后添加 3.输入键 例如:http://struts.apache.org/dtds/struts-2.3.dtd ...
- 【WPF】一些拖拽实现方法的总结(Window,UserControl)
原文:[WPF]一些拖拽实现方法的总结(Window,UserControl) 原文地址 https://www.cnblogs.com/younShieh/p/10811456.html 前文 本文 ...
- wait/notify方法
执行wait方法会释放锁,执行notify不会释放锁 package com.qf.test05.pojo; /** * @author qf * @create 2018-09-18 10:41 * ...
- 在并发Java应用程序中检测可见性错误
了解什么是可见性错误,为什么会发生,以及如何在并发Java应用程序中查找难以捉摸的可见性错误.这些问题你可能也遇到过,当在优锐课学习了一段时间后,我对这些问题有了一定见解,写下这篇文章和大家分享. 检 ...
- cmake 加入调试信息
1 首先在CMakeLists.txt中加入 SET(CMAKE_BUILD_TYPE "Debug")1在下面加入: SET(CMAKE_CXX_FLAGS_DEBUG &quo ...