背景:有一批数据源从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>进行去重和覆盖的更多相关文章

  1. Java8 根据对象某个属性值去重

    list中的对象某个属性存在重复时将重复的对象去重 //根据skuAttrValueName值去重 List<SkuValue> uniqueSkuValues = skuValues.s ...

  2. Java8 list根据对象某个属性去重

    1. 添加方法: import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import j ...

  3. Spring框架配置文件中有两个相同名字的bean,最后会覆盖掉一个bean

    问题容易出现在多个人合作的项目中,定义bean的名字的时候发生重复. 可以配置当bean定义重复的时候抛出异常,结束程序,强制提示更改重复的bean.

  4. java8 常用代码

    1. 使用java8 提取出 list 中 bean 的某一属性 public static void main(String[] args) { List<Student> stuLis ...

  5. Spring笔记 - Bean xml装配

    命名空间表 aop Provides elements for declaring aspects and for automatically proxying @AspectJannotated c ...

  6. List去重问题与方法

    面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固.我们大家都知道,set集合的特点就是没有重复的元素.如果集合中的数据类型是基本数 ...

  7. Java中5种List的去重方法及它们的效率对比,你用对了吗?

    01.使用两个for循环实现List去重(有序) /**使用两个for循环实现List去重(有序)     *     * @param list     * */    public static  ...

  8. [spring源码学习]四、IOC源码——普通bean初始化

    一.代码例子 此节开始涉及到一个bean具体生成和保存的过程,仅仅涉及到最简单的bean,代码依旧是最简单的 public static void main(String[] args) { Defa ...

  9. 【Spring源码解读】bean标签中的属性(二)你可能还不够了解的 abstract 属性和 parent 属性

    abstract 属性说明 abstract 在java的语义里是代表抽象的意思,用来说明被修饰的类是抽象类.在Spring中bean标签里的 abstract 的含义其实也差不多,表示当前bean是 ...

随机推荐

  1. webstorm 分屏

  2. python学习笔记:itsdangerous模块

    使用itsdangerous生成临时身份令牌 安装 pip install itsdangerous 使用 import itsdangerous salt='sdaf'#加盐 t=itsdanger ...

  3. css中的居中问题

    前两天写了一篇关于display:table的用法,里面涉及到居中的问题,这两天愈发觉得css中的居中是一个值得关注的问题,现总结如下. 一.垂直居中 (1)inline或者inline-*元素 1. ...

  4. vue做一个上移和下移,删除的li 功能

    效果图: 思路就是冒泡原理,把数据放到一个空数组,对其进行排序, 单选框用到的是iview . 具体实现代码: <div v-for="item in singledLists&quo ...

  5. springboot整合jsp 遇到的问题

    1,在idea中新建jsp文件 首先需要在springboot项目 在src 中webapp /WEB-INF/JSP 当我右键想新建一个jsp文件时默认没有 File->Project Str ...

  6. WPF 动态添加控件以及样式字典的引用(Style introduction)

    原文:WPF 动态添加控件以及样式字典的引用(Style introduction) 我们想要达到的结果是,绑定多个Checkbox然后我们还可以获取它是否被选中,其实很简单,我们只要找到那几个关键的 ...

  7. sleep()方法和wait()方法的区别? sleep()方法和yield()方法的区别?

    sleep()方法和wait()方法的区别? sleep方法是Thread的静态方法,wait方法是Object类的普通方法 sleep方法不释放同步锁,wait方法释放同步锁(执行notify方法唤 ...

  8. PHP-在排序数组中查找元素的第一个和最后一个位置

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  9. web.xml中配置——配置springmvc

    <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springfr ...

  10. Django 自定义扩展命令

    import datetime import logger from django.conf import settings from django.db.models import Q from d ...