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

简介: Java通过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方法收集为一个新的集合。


代码运行结果


3990be33ad6347fcb3c35d331416e208.png

方法二获取重复数据

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());


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


代码运行结果

ec424a1599d942fabc1d097acad8d157.png




相关文章
|
10天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
32 5
|
22天前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
23天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
34 4
|
25天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
26天前
|
并行计算 Java 编译器
深入理解Java中的Lambda表达式
在Java 8中引入的Lambda表达式,不仅简化了代码编写,还提升了代码可读性。本文将带你探索Lambda表达式背后的逻辑与原理,通过实例展示如何高效利用这一特性优化你的程序。
|
1月前
|
搜索推荐 Java API
探索Java中的Lambda表达式
本文将深入探讨Java 8引入的Lambda表达式,这一特性极大地简化了代码编写,提高了程序的可读性。通过实例分析,我们将了解Lambda表达式的基本概念、使用场景以及如何优雅地重构传统代码。文章不仅适合初学者,也能帮助有经验的开发者加深对Lambda表达式的理解。
|
1月前
|
Java
探索Java中的Lambda表达式
【10月更文挑战第37天】本文将带你深入理解Java的Lambda表达式,从基础语法到高级特性,通过实例讲解其在函数式编程中的应用。我们还将探讨Lambda表达式如何简化代码、提高开发效率,并讨论其在实际项目中的应用。
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
21天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
24天前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
26 0