java中List<对象>如何根据对象的一个属性进行去重

 更新时间:2023年08月23日 11:07:22   作者:一只小念  
这篇文章主要给大家介绍了关于java中List<对象>如何根据对象的一个属性进行去重的相关资料,在开发中可能会遇到很多需要去重的情况,比如Person对象有name跟age两个属性,需要根据age进行去重,需要的朋友可以参考下

1.如果你想根据对象的一个属性进行去重,可以使用Java 8中的Stream API。

具体步骤如下:

1.实现一个自定义函数,该函数将用于确定两个对象是否相等,例如:

public static <T> Predicate<T> distinctByProperty(Function<? super T, Object> keyExtractor) {
    Map<Object, Boolean> map = new ConcurrentHashMap<>();
    return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

这个函数接受一个Function对象作为参数,该函数将从对象中提取唯一标识属性,并使用ConcurrentHashMap来确定是否已经处理过该属性值。 

2.现在你可以使用这个函数来进行去重了,例如:

List<MyObject> myList = ... // Your list of objects
List<MyObject> distinctList = myList.stream().filter(distinctByProperty(MyObject::getSomeProperty)).collect(Collectors.toList());

 这个代码将对myList进行去重,只保留唯一的对象(即,他们的某个属性相同)。其中,getSomeProperty是MyObject类中的一个方法,它返回用于去重的属性

2.一行代码完成

ArrayList<BasicSectionCfg>list1=list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()->newTreeSet<>(Comparator.comparing(BasicSectionCfg::getPamKey))),ArrayList::new));

这段代码使用Java 8中的流API将一个ArrayList<BasicSectionCfg>进行去重并转换成另一个ArrayList。

具体来说,大致可以分为以下几步:

  • 使用stream()方法将原始的ArrayList<BasicSectionCfg>转换成一个流Stream<BasicSectionCfg>。
  • 使用collect()方法将流Stream<BasicSectionCfg>收集并转换成另一个集合。collect()方法接收一个Collector对象,并且Collectors类中提供了许多预定义的Collector实现,方便我们使用。在本段代码中,我们使用了Collectors.collectingAndThen()方法,它将一个Collector转换成另一个Collector,并在最后的结果上进行一些操作。
  • 在Collectors.collectingAndThen()方法中,我们传递了两个参数:

    第一个参数是Collectors.toCollection()方法,它创建了一个新的TreeSet集合,该集合使用Comparator.comparing()方法来对元素进行排序。其中Comparator.comparing()方法接收一个Function参数,该函数用于提取对象的某个属性,这里我们使用BasicSectionCfg::getPamKey方法来提取BasicSectionCfg对象的pamKey属性。

    第二个参数是一个lambda表达式,它将TreeSet转换成ArrayList集合。具体地,它调用了ArrayList的构造函数,并将TreeSet作为参数传递给构造函数。

最终,这段代码的作用就是将list中的重复元素去重,并按照BasicSectionCfg对象的pamKey属性进行排序,得到一个新的ArrayList集合。

附:java list中根据对象多个属性去重方便快捷的方法

关键方法:

List<TestBean> distinctClass = list1.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(
o -> o.getListName() + ";" + o.getName() + ";" + o.getXxName()))), ArrayList::new));

测试代码:

public static void main(String[] args) {
    TestBean testBean = new TestBean();
    List<TestBean> list1 = new ArrayList<>();
    testBean = new TestBean();
    testBean.setName("3");
    testBean.setListName("3");
    testBean.setXxName("3");
    list1.add(testBean);
    testBean = new TestBean();
    testBean.setName("1");
    testBean.setListName("1");
    testBean.setXxName("1");
    list1.add(testBean);
    testBean = new TestBean();
    testBean.setName("2");
    testBean.setListName("2");
    testBean.setXxName("2");
    list1.add(testBean);
    testBean = new TestBean();
    testBean.setName("2");
    testBean.setListName("2");
    testBean.setXxName("2");
    list1.add(testBean);
    System.out.println("原list大小:" + list1.size());
    List<TestBean> distinctClass = list1.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getListName() + ";" + o.getName() + ";" + o.getXxName()))), ArrayList::new));
    System.out.println("去重后的list大小:" + distinctClass.size());
}

输出结果如下:

原list大小:4
去重后的list大小:3

总结

到此这篇关于java中List&lt;对象&gt;如何根据对象的一个属性进行去重的文章就介绍到这了,更多相关java List&lt;对象&gt;去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Spring Boot Maven插件的详细方法

    使用Spring Boot Maven插件的详细方法

    这篇文章主要介绍了如何使用Spring Boot Maven插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • eclipse springboot工程打war包方法及再Tomcat中运行的方法

    eclipse springboot工程打war包方法及再Tomcat中运行的方法

    这篇文章主要介绍了eclipse springboot工程打war包方法及再Tomcat中运行的方法,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Java 日期与时间API相关用法总结

    Java 日期与时间API相关用法总结

    这篇文章主要介绍了Java 日期与时间API相关用法总结,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • java二维数组实现推箱子小游戏

    java二维数组实现推箱子小游戏

    这篇文章主要为大家详细介绍了java二维数组实现推箱子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Resttemplate上传文件500异常的原因及解决方法

    Resttemplate上传文件500异常的原因及解决方法

    使用 Resttemplate 调用 DMS 文件服务器 Http 接口,出现 500 异常报错,所以本文给大家介绍了Resttemplate上传文件500异常的原因及解决方法,需要的朋友可以参考下
    2024-08-08
  • SpringBoot + UniApp对接微信OAuth2登录的全过程

    SpringBoot + UniApp对接微信OAuth2登录的全过程

    现在小程序逐渐成为主流,常用的微信授权登录很重要很常见的一个功能,这篇文章主要介绍了使用SpringBoot + UniApp对接微信OAuth2登录的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • JavaWeb仓库管理系统详解

    JavaWeb仓库管理系统详解

    这篇文章主要为大家详细介绍了JavaWeb仓库管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 解读Token失效的6种方案

    解读Token失效的6种方案

    本文探讨SpringBoot中实现JWT令牌失效的六种方案,包括短期令牌+刷新令牌、Redis黑名单、令牌版本机制等,分析其优缺点及适用场景,指导如何根据安全与性能需求选择合适策略
    2025-08-08
  • 使用WebUploader实现分片断点上传文件功能(二)

    使用WebUploader实现分片断点上传文件功能(二)

    这篇文章主要为大家详细介绍了使用WebUploader实现分片断点上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • java中JVM中如何存取数据和相关信息详解

    java中JVM中如何存取数据和相关信息详解

    这篇文章主要介绍了JVM中如何存取数据和相关信息详解,Java源代码文件(.java后缀)会被Java编译器编译为字节码文件,然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。JVM中怎么存取数据和相关信息呢?,需要的朋友可以参考下
    2019-06-06

最新评论