背景:有一批数据源从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. 前端学习笔记——引入css文件、样式优先级

    CSS样式的引用方式有三种:行间样式表>内部样式表>外部样式表. 如果只有一种样式,那么优先级“由内到外 由近到远” 1.行间样式表--内联方式 内联方式指的是直接在 HTML 标签中的  ...

  2. 力扣算法题—144Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [1,null,2,3 ...

  3. 常用内置模块(一)——time、os、sys、random、shutil、pickle、json

    常用内置模块 一.time模块 在python中,时间分为3种       1.时间戳: timestamp,从1970年1月1日到现在的秒数, 主要用于计算两个时间的差    2.localtime ...

  4. linux 服务器内存占用统计

    当前内存占用率的计算,是根据top命令显示的Mem.used除以Mem.total得到. Mem.total:表示总物理内存. Mem.used: 表示内核控制的内存数,除了应用程序使用的内存外,还包 ...

  5. ABTest介绍及abtest流量切换实现

    本文为学习abtest切流方案方便以后查看大部分内容转载自原文 https://blog.csdn.net/tanweii163/article/details/80543083 互联网公司的业务发展 ...

  6. [轉]关于CR0.WP

    关于CR0.WP 我们知道CR0的WP位可以关闭内核写保护.他和页表的R/W位有关.Intel手册中的描述绕来绕去似乎一直没有说到重点. When the processor is in superv ...

  7. Linux 版本查詢

    # uname -a 查看  Kernel版本 # cat /etc/redhat-release查看 linux版本(以RedHat為例) 1.核心查詢:uname -a結果:Linux 2.x.x ...

  8. Neo4j数据库学习一:安装和数据类型常用命令简介

    Neo4j数据库是图数据库 在数据库中,只有节点Nodes和关系Relationships Nodes用圆圈表示,Relationships用有向箭头表示 关系和节点都有属性(键值对) 安装3.3.7 ...

  9. timezone

    Calendar cal2 = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss&q ...

  10. 在Mac OS终端的Terminal 中使用Sublime Text3

    查看环境变量: $ echo $PATH $ /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 创建软链接: $ sudo ln -s /Application ...