Java关于List集合去重方案详细介绍

 更新时间:2021年09月15日 10:36:36   作者:JavaEdge.  
实际项目开发中,很多业务场景下都会遇见集合去重。在说到List集合去重之前,首先我们回顾下普通类型的list如何去重

1 常规去重

碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素。

// 遍历后判断赋给另一个List集合,保持原来顺序
public static void ridRepeat1(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>();
    for (String str : list) {
        if (!listNew.contains(str)) {
            listNew.add(str);
        }
    }
    System.out.println("listNew = [" + listNew + "]");
}

// Set集合去重,保持原来顺序
public static void ridRepeat2(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>();
    Set set = new HashSet();
    for (String str : list) {
        if (set.add(str)) {
            listNew.add(str);
        }
    }
    System.out.println("listNew = [" + listNew + "]");
}

// Set去重     由于Set(HashSet)的无序性,不会保持原来顺序
public static void ridRepeat3(List<String> list) {
    System.out.println("list = [" + list + "]");
    Set set = new HashSet();
    List<String> listNew = new ArrayList<String>();
    set.addAll(list);
    listNew.addAll(set);
    System.out.println("listNew = [" + listNew + "]");
}

// Set通过HashSet去重(将ridRepeat3方法缩减为一行) 无序
public static void ridRepeat4(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new HashSet(list));
    System.out.println("listNew = [" + listNew + "]");
}

// Set通过TreeSet去重   会按字典顺序重排序
public static void ridRepeat5(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new TreeSet<String>(list));
    System.out.println("listNew = [" + listNew + "]");
}

// Set通过LinkedHashSet去重  保持原来顺序
public static void ridRepeat6(List<String> list) {
    System.out.println("list = [" + list + "]");
    List<String> listNew = new ArrayList<String>(new LinkedHashSet<String>(list));
    System.out.println("listNew = [" + listNew + "]");
}

stream去重

  //利用java8的stream去重
  List uniqueList = list.stream().distinct().collect(Collectors.toList());
  System.out.println(uniqueList.toString());

上面的方法在List元素为基本数据类型及String类型时是可以的,但是如果List集合元素为对象,却失效了!

2 对象去重

可利用for循环遍历的方式进行判断去重,很简单不赘述,看如下方法:

2.1 stream去重

// 根据name属性去重
List<User> uniqueNameList = userList
        .stream()
        .collect(collectingAndThen(
                toCollection(() -> new TreeSet<>(comparing(User::getName))), ArrayList::new)
        );

System.out.println("根据name去重后集合元素:" + uniqueNameList.toString());

// 根据name,age属性去重
List<User> uniqueNameAndAgeList = userList
        .stream()
        .collect(collectingAndThen(
                toCollection(() -> new TreeSet<>(comparing(o -> o.getName() + ";" + o.getAge()))), ArrayList::new)
        );

System.out.println("根据name,age去重后集合元素:" + uniqueNameAndAgeList.toString());

输出结果:

重写equals()、hashCode()

//重写equals方法
 @Override
    public boolean equals(Object obj) {
        User user = (User) obj;
        return name.equals(user.getName()) && (age==user.getAge());
    }

//重写hashCode方法
    @Override
    public int hashCode() {
        String str = name + age;
        return str.hashCode();
    }

到此这篇关于Java关于List集合去重方案详细介绍的文章就介绍到这了,更多相关Java List集合去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven仓库加载顺序的实例解析

    Maven仓库加载顺序的实例解析

    Maven仓库一般分为本地仓库和远程仓库。那么在实际开发中,在配置了多个仓库的情况下,他们之间的加载访问顺序是怎么样的呢,本文就详细的来介绍一下
    2021-12-12
  • Java Synchronize下的volatile关键字详解

    Java Synchronize下的volatile关键字详解

    这篇文章主要介绍了Java Synchronize下的volatile关键字详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • idea创建javaweb原生项目的实现示例

    idea创建javaweb原生项目的实现示例

    这篇文章主要介绍了idea创建javaweb原生项目的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Jenkins迁移job插件Job Import Plugin流程详解

    Jenkins迁移job插件Job Import Plugin流程详解

    这篇文章主要介绍了Jenkins迁移job插件Job Import Plugin流程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • java通过反射创建对象并调用方法

    java通过反射创建对象并调用方法

    这篇文章主要介绍了java通过反射创建对象并调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • spring boot(四)之thymeleaf使用详解

    spring boot(四)之thymeleaf使用详解

    Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。接下来通过本文给大家介绍spring boot(四)之thymeleaf使用详解,需要的朋友可以参考下
    2017-05-05
  • Spring Boot系列教程之死信队列详解

    Spring Boot系列教程之死信队列详解

    这篇文章主要给大家介绍了关于Spring Boot系列教程之死信队列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • SpringBoot基于自定义注解实现切面编程

    SpringBoot基于自定义注解实现切面编程

    这篇文章主要介绍了SpringBoot基于自定义注解实现切面编程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 详解Java的堆内存与栈内存的存储机制

    详解Java的堆内存与栈内存的存储机制

    这篇文章主要介绍了Java的堆内存与栈内存的存储机制,包括JVM的内存优化和GC等相关方面内容,需要的朋友可以参考下
    2016-01-01
  • mybatis foreach传两个参数批量删除

    mybatis foreach传两个参数批量删除

    这篇文章主要介绍了mybatis foreach 批量删除传两个参数,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04

最新评论