java中stream去重的几种方式举例

 更新时间:2023年07月19日 16:59:23   作者:zml_666  
Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列,这篇文章主要给大家介绍了关于java中stream去重的几种方式,需要的朋友可以参考下

使用 Stream 的 distinct() 方法

这个方法会根据元素的 hashCode() 和 equals() 方法来判断是否重复。如果是自定义的类,需要重写这两个方法。

示例:

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

使用 collectingAndThen() 和 toCollection() 方法

这个方法可以根据元素的某个属性或者多个属性来去重,比如 name 或者 name+address。这个方法会使用 TreeSet 来排序元素,所以不能保持原来的顺序。

示例:

//根据name属性去重
List<User> lt = list.stream().collect(
        collectingAndThen(
                toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))),
                ArrayList::new)
);
System.out.println("去重后的:" + lt);

使用 filter() 方法

这个方法需要自定义一个 Predicate 函数,用一个 Set 来记录已经出现过的元素,然后过滤掉重复的元素。

示例:

//定义一个Predicate函数
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}
//根据age属性去重
list.stream().filter(distinctByKey(s -> s.getAge()))
        .forEach(System.out::println);

补充知识:自定义去重

如何采用stream进行自定义去重呢?

我们以age字段为例,进行去重

预期结果

总结

到此这篇关于java中stream去重的几种方式的文章就介绍到这了,更多相关java stream去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程Condition接口原理介绍

    Java多线程Condition接口原理介绍

    这篇文章主要介绍了Java多线程Condition接口原理介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Struts2+Hibernate实现数据分页的方法

    Struts2+Hibernate实现数据分页的方法

    这篇文章主要介绍了Struts2+Hibernate实现数据分页的方法,结合实例形式分析了Struts2结合Hibernate实现数据分页的原理,步骤与相关实现代码,需要的朋友可以参考下
    2016-03-03
  • 图解Java排序算法之堆排序

    图解Java排序算法之堆排序

    这篇文章主要为大家详细介绍了Java经典排序算法之堆排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 深入了解Java中String、Char和Int之间的相互转换

    深入了解Java中String、Char和Int之间的相互转换

    这篇文章主要介绍了深入了解Java中String、Char和Int之间的相互转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • java.io.NotSerializableException异常的问题及解决

    java.io.NotSerializableException异常的问题及解决

    这篇文章主要介绍了java.io.NotSerializableException异常的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java设计模式之命令模式CommandPattern详解

    Java设计模式之命令模式CommandPattern详解

    这篇文章主要介绍了Java设计模式之命令模式CommandPattern详解,命令模式是把一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作,需要的朋友可以参考下
    2023-10-10
  • RateLimit-使用guava来做接口限流代码示例

    RateLimit-使用guava来做接口限流代码示例

    这篇文章主要介绍了RateLimit-使用guava来做接口限流代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java实现班级管理系统

    Java实现班级管理系统

    这篇文章主要为大家详细介绍了Java实现班级管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • spring事务隔离级别、传播机制以及简单配置方式

    spring事务隔离级别、传播机制以及简单配置方式

    这篇文章主要介绍了spring事务隔离级别、传播机制以及简单配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 在Eclipse中运行Solr 基础知识

    在Eclipse中运行Solr 基础知识

    Solr我还是个菜鸟,写这一些文章只是记录一下最近一段时间学习Solr的心得,望各位同仁不要见笑,还希望多多指点
    2012-11-11

最新评论