首页 > 编程语言 >Java通过Lambda表达式根据指定字段去除重复数据(集合去重)

Java通过Lambda表达式根据指定字段去除重复数据(集合去重)

时间:2022-12-03 10:04:32浏览次数:35  
标签:Java String list util Student new public 表达式 Lambda


这里博主给大家封装好了一个工具类,里面有两个方法。

  • 方法一:可以根据指定字段去除重复数据。
  • 方法二:可以获取到重复的数据。

大家在使用过程中直接拷贝下方代码在要去重的类中调用即可。

package com.jzmy.specialist.entity.util;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;

/**
* 操作去重工具类
* @author mengzhichao
* @create 2022-11-02-15:15
*/
public class DeduplicationUtil {
/**
* 自定义函数去重(采用 Predicate函数式判断,采用 Function获取比较key)
* 内部维护一个 ConcurrentHashMap,并采用 putIfAbsent特性实现
*
* @param keyExtractor
* @param <T>
* @return
*/
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;
}

/**
* 只获取重复的数据
*
* @param keyExtractor
* @param <T>
* @return
*/
public static <T> Predicate<T> distinctNotByKey(Function<? super T, ?> keyExtractor) {
Map<Object,Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) != null;
}
}

导入这个工具类后怎么使用呢?我们接着往下看。

方法一根据指定字段去重

package com.jzmy.specialist.entity.util;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author mengzhichao
* @create 2022-12-02-10:46
*/
public class Test {
public static class Student{

private String id;

private String name;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

public static void main(String[] args) {

List<Student> list =new ArrayList<>();

Student student =new Student();
student.setId("1");
student.setName("张三");
list.add(student);

Student student2 =new Student();
student2.setId("1");
student2.setName("张三");
list.add(student2);

Student student3 =new Student();
student3.setId("1");
student3.setName("李四");
list.add(student3);

Student student4 =new Student();
student4.setId("2");
student4.setName("王五");
list.add(student4);

System.out.println("未去重前list有几条数据:"+list.size());


List<Student> rstList = list.stream().filter(DeduplicationUtil.distinctByKey(Student::getId)).collect(Collectors.toList());

System.out.println("未去重前list有几条数据:"+rstList.size());
}
}

List rstList = list.stream().filter(DeduplicationUtil.distinctByKey(Student::getId)).collect(Collectors.toList());

  • 这段代码的意思是通过stream的filter方法进行过滤,过滤Id不相同的数据并通过collect方法收集为一个新的集合。

代码运行结果

Java通过Lambda表达式根据指定字段去除重复数据(集合去重)_System

方法二获取重复数据

package com.jzmy.specialist.entity.util;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author mengzhichao
* @create 2022-12-02-10:46
*/
public class Test {
public static class Student{

private String id;

private String name;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

public static void main(String[] args) {

List<Student> list =new ArrayList<>();

Student student =new Student();
student.setId("1");
student.setName("张三");
list.add(student);

Student student2 =new Student();
student2.setId("1");
student2.setName("张三");
list.add(student2);

Student student3 =new Student();
student3.setId("1");
student3.setName("李四");
list.add(student3);

Student student4 =new Student();
student4.setId("2");
student4.setName("王五");
list.add(student4);

System.out.println("集合中的全部数据");
for (int i=0;i<list.size();i++){
System.out.println(list.get(i).getId());
System.out.println(list.get(i).getName());
}

List<Student> rstList = list.stream().filter(DeduplicationUtil.distinctNotByKey(Student::getId)).collect(Collectors.toList());

System.out.println("集合中的重复数据");
for (int i=0;i<rstList.size();i++){
System.out.println(rstList.get(i).getId());
System.out.println(rstList.get(i).getName());
}
}
}

List rstList = list.stream().filter(DeduplicationUtil.distinctNotByKey(Student::getId)).collect(Collectors.toList());

  • 这个和上面那个方法原理一样的只是换了一个调用方法而已。

代码运行结果

Java通过Lambda表达式根据指定字段去除重复数据(集合去重)_jvm_02


标签:Java,String,list,util,Student,new,public,表达式,Lambda
From: https://blog.51cto.com/u_15493174/5908465

相关文章

  • 强制解决Java参数乱码问题
    在我们日常开发中,常常复制的url路径都是这样的原路径:https://xxxx.oss-cn-hangzhou.xxxxxx.com/2022/xx/文件名.pdf复制出来的路径:https://xxxx.oss-cn-hangzhou.xxxxxx.com......
  • 【JavaEE进阶系列 | 从小白到工程师】基本类型包装类的使用,装箱以及拆箱与parseInt方
    一、包装类概述Java中的数据类型分为基本类型和引用类型两大类,使用基本类型可以提升效率但是java是面向对象的语言,java的设计思想是一切皆对象,而基本数据类型不是对象,于是J......
  • 看完这篇,还不懂JAVA内存模型(JMM)算我输
    欢迎关注专栏【JAVA并发】更多技术干活尽在个人公众号——JAVA旭阳前言开篇一个例子,我看看都有谁会?如果不会的,或者不知道原理的,还是老老实实看完这篇文章吧。@Slf4j(......
  • leetcode.cn 10.正则表达式匹配 记忆化搜索
    心血来潮想刷刷题玩,想起leetcode,注册登录,知道leetcode上的题都比较简单,就勾选难度为“困难”,然后看到此题。读完题,心想这标为“困难”,该不会是得用DFA甚至NFA吧?又仔细看......
  • 解析式和生成器表达式
    列表解析式列表解析式ListComprehension,也叫列表推导式x=[]foriinrange(10):x.append((i+1)**2)print(x)写成推导式[(i+1)**2foriinrange(10)]Out[......
  • java基础面试
    一、clone一、浅拷贝clone()如果对象中的所有数据域都是数值或者基本类型,使用clone()即可满足需求,如:Personp=newPerson();Personp1=p.clone();这样p和p1分别指向不......
  • C# AES CFB加解密模式兼容JAVA
    C#AESCFB加解密模式兼容JAVA代码片段最近在和java做对接的时候老是遇到加密使用java写的,需要我们使用C#来解密相关数据,AES加解密平常也在用,但是这种跨语言的应用还是比较......
  • 【Java并发入门】03 互斥锁(上):解决原子性问题
    原子性问题的源头是线程切换Q:如果禁用CPU线程切换是不是就解决这个问题了?A:单核CPU可行,但到了多核CPU的时候,有可能是不同的核在处理同一个变量,即便不切换线程,也有问......
  • jenkins javax.mail.AuthenticationFailedException: 535 authentication failed
     邮箱服务器端口是587解决方案:启动脚本增加-Dmail.smtp.starttls.enable=true-Dmail.smtp.ssl.trust=esmtp.*.com  ......
  • java三大特性
    什么是面向对象面向对象变成的本质就是:以类的方式组织代码、以对象的组织封装数据抽象三大特性:封装、继承、多态从认识论角度考虑是现有对象后有类。对象,是具体的事物......