【SpringBoot】List<实体类>如何去重,单、多属性去重

简介: 【SpringBoot】List<实体类>如何去重,单、多属性去重

sql中去重可以使用distinct关键字,但是有时候需要在list中去重,大概有以下几种方式

1.嵌套for循环去重

因为list删除一个元素会让后面的元素前移,所以可以倒着删除,也可以使用迭代器

                for (int i = projectList.size() - 1; i >= 0; i--) {
                    for (int j = projectList.size() - 1; j >= 0; j--) {
                        if (projectList.get(i).getId().equals(projectList.get(j).getId())) {                      
                               projectList.remove(j);
                               i-=1;                       
                        }
                    }
                }

2.根据equals方法去重

list

3. HashSet去重

利用set元素不可重复的特性

/// 去重
                    Set<Project> userSet = new HashSet<>(projectFatherList);
                    projectFatherList = new ArrayList<>(userSet);

4. stream流去重

普通版

projectList=projectList.stream().distinct().collect(Collectors.toList());

根据某个字段去重

// 第一种
 projectList = projectList.stream().filter(distinctByKey((p) -> (p.getT_custId()))).collect(Collectors.toList());


   public static <T>Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor){
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t),Boolean.TRUE) == null;
    }
// 第二种
collectingAndThen

 List<ExportTemperatureDto> result = temperatureList.stream()
                .collect(
                        collectingAndThen(
                                toCollection(
                                        () -> new TreeSet<>(comparing(ExportTemperatureDto::getPersonId))
                                ),
                                ArrayList::new
                        )
                );

根据某个字段去重也可以重写实体的equals方法

根据多个字段去重

        List<ResourcesData> distinctClass = resourcesDataList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getSkill() + ";" + o.getTechLevel()))), ArrayList::new));

总结

总体上stream流去重是比较方便的,速度上也是比较快

目录
相关文章
|
23天前
|
前端开发 开发者
CSS列表属性:list-style系列属性详解
CSS列表属性:list-style系列属性详解
119 40
|
18天前
|
Java 数据库连接 Maven
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
文本,使用SpringBoot工程创建一个Mybatis-plus项目,Mybatis-plus在编写数据层接口,用extends BaseMapper<User>继承实体类
|
17天前
|
文字识别 Java
文本,文字识别07,SpringBoot服务开发-入参和返回值,编写接口的时候,要注意识别的文字返回的是多行,因此必须是List集合,Bean层,及实体类的搭建
文本,文字识别07,SpringBoot服务开发-入参和返回值,编写接口的时候,要注意识别的文字返回的是多行,因此必须是List集合,Bean层,及实体类的搭建
|
1月前
|
Java 关系型数据库 MySQL
SpringBoot系列教程之事务传递属性
SpringBoot系列教程之事务传递属性
|
2月前
|
Java Maven
springboot jar包启动提示没有主清单属性
springboot jar包启动提示没有主清单属性
|
2月前
|
Java 开发者 Spring
Spring Boot中的资源文件属性配置
【4月更文挑战第28天】在Spring Boot应用程序中,配置文件是管理应用程序行为的重要组成部分。资源文件属性配置允许开发者在不重新编译代码的情况下,对应用程序进行灵活地配置和调整。本篇博客将介绍Spring Boot中资源文件属性配置的基本概念,并通过实际示例展示如何利用这一功能。
34 1
|
2月前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
42 1
|
2月前
|
Java
Java使用List去重的四中方式
Java使用List去重的四中方式
29 6
|
2月前
|
JSON Java 数据格式
SpringBoot配置文件属性注入
SpringBoot配置文件属性注入
39 0
|
26天前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
21 1