Java List按照某字段去重的使用示例

 更新时间:2023年12月28日 15:11:00   作者:布丁吖  
在Java开发中,我们经常会面临对List中对象属性去重的需求,本文主要介绍了Java List按照某字段去重的使用示例,具有一定的参考价值,感兴趣的可以了解一下

嘚吧嘚

Java8流的新类java.util.stream.Collectors实现了java.util.stream.Collector接口,同时又提供了大量的方法对流(stream)的元素执行各种统计操作。

distinct

示例一

List<Map<String, Object>> mapList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    HashMap<String, Object> e = new HashMap<>();
    e.put("name", "Mike");
    e.put("age", 19);
    mapList.add(e);
    HashMap<String, Object> f = new HashMap<>();
    f.put("name", "John");
    f.put("age", 19);
    mapList.add(f);
}
System.out.println(mapList);
System.out.println("===================去重===================");
List<Map<String, Object>> collect = mapList.stream().distinct().collect(Collectors.toList());
collect.forEach(System.out::println);

执行结果如下

在这里插入图片描述

但是这种方式必须要每个键值对都一样,才会被判定成重复的,否则不会被判为重复,如下。

示例二

List<Map<String, Object>> mapList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    HashMap<String, Object> e = new HashMap<>();
    e.put("name", "Mike");
    e.put("age", 19 + i);
    mapList.add(e);
    HashMap<String, Object> f = new HashMap<>();
    f.put("name", "John");
    f.put("age", 19 + i);
    mapList.add(f);
}
System.out.println(mapList);
System.out.println("===================去重===================");
List<Map<String, Object>> collect = mapList.stream().distinct().collect(Collectors.toList());
collect.forEach(System.out::println);

执行结果如下

在这里插入图片描述

虽然name的值一样,但是age的值不一样,所以没有被被判定为重复。

所以如果要按照某字段去重,请采用如下方式。

根据某个字段去重

List<Map<String, Object>> mapList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
    HashMap<String, Object> e = new HashMap<>();
    e.put("name", "Mike");
    e.put("age", 19 + i);
    mapList.add(e);
    HashMap<String, Object> f = new HashMap<>();
    f.put("name", "John");
    f.put("age", 19 + i);
    mapList.add(f);
}
System.out.println(mapList);
System.out.println("===================去重===================");
List<Map<String, Object>> collect = mapList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(p -> String.valueOf(p.get("name"))))), ArrayList::new));
collect.forEach(System.out::println);

执行结果如下

在这里插入图片描述

代码中用到了“Collectors.collectingAndThen”,这个函数是干什么的呢?咱们继续。

Collectors.collectingAndThen()

从函数名字就可以看出,这个函数分为两个部分,一个是collecting,另一个是then。

Collectors.collectingAndThen()函数很像map and reduce,它可接受两个参数,第一个参数用于reduce(collecting)操作,而第二参数用于map(then)操作。
也就是,先把流中的所有元素传递给第一个参数,然后把生成的集合传递给第二个参数来处理。

List<Integer> list = Arrays.asList(1, 2, 3, 4);
Double result = list.stream().collect(Collectors.collectingAndThen(Collectors.averagingLong(item -> item * 2), res -> res * 3));
System.out.println("result = " + result);

执行结果如下

在这里插入图片描述

逻辑如下

把[1,2,3,4]这个集合传递给item -> item * 2这个lambda表达式,计算得出结果为[2,4,6,8]

然后再把[2,4,6,8]传递给Collectors.averagingLong表达式,计算得出5.0

然后传递给res -> res * 3这个lambda表达式,计算得到结果为15.0

到此这篇关于Java List按照某字段去重的使用示例的文章就介绍到这了,更多相关Java List字段去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java实现文件压缩为zip和解压zip压缩包

    Java实现文件压缩为zip和解压zip压缩包

    这篇文章主要为大家介绍了Java如何实现将文件压缩为zip以及解压zip压缩包,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-06-06
  • SpringBoot限制接口访问频率避坑

    SpringBoot限制接口访问频率避坑

    这篇文章主要为大家介绍了SpringBoot限制接口访问频率避坑,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Java Collection接口中的常用方法总结

    Java Collection接口中的常用方法总结

    这篇文章将大概用代码案例简单总结一下 Collection 接口中的一些方法,我们会以他的实现类 Arraylist 为例创建对象。快一起来看看吧
    2022-12-12
  • Java多线程之volatile关键字及内存屏障实例解析

    Java多线程之volatile关键字及内存屏障实例解析

    volatile是JVM提供的一种最轻量级的同步机制,因为Java内存模型为volatile定义特殊的访问规则,使其可以实现Java内存模型中的两大特性:可见性和有序性。这篇文章主要介绍了Java多线程之volatile关键字及内存屏障,需要的朋友可以参考下
    2019-05-05
  • 基于slf4j日志MDC输出格式的问题

    基于slf4j日志MDC输出格式的问题

    这篇文章主要介绍了基于slf4j日志MDC输出格式的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Jmeter跨线程组传值调用实现图解

    Jmeter跨线程组传值调用实现图解

    这篇文章主要介绍了Jmeter跨线程组传值调用实现图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Spring入门实战之Profile详解

    Spring入门实战之Profile详解

    什么是spring profile?简单讲profile就是一组配置,不同profile提供不同组合的配置,程序运行时可以选择使用哪些profile来适应环境。下面这篇文章主要介绍了Spring中Profile实战的相关资料,需要的朋友可以参考借鉴。
    2017-02-02
  • java 字符串内存分配的分析与总结(推荐)

    java 字符串内存分配的分析与总结(推荐)

    下面小编就为大家带来一篇java 字符串内存分配的分析与总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • SpringCloud Zuul自定义filter代码实例

    SpringCloud Zuul自定义filter代码实例

    这篇文章主要介绍了SpringCloud Zuul自定义filter代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用1招搞定maven打包空间不足的问题

    使用1招搞定maven打包空间不足的问题

    这篇文章主要介绍了使用1招搞定maven打包空间不足的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09

最新评论