欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 8 Stream.distinct() 列表去重的操作

程序员文章站 2022-04-29 13:35:48
在这篇文章里,我们将提供java8 stream distinct()示例。 distinct()返回由该流的不同元素组成的流。distinct()是stream接口的方法。distinct()使用h...

在这篇文章里,我们将提供java8 stream distinct()示例。 distinct()返回由该流的不同元素组成的流。distinct()是stream接口的方法。

distinct()使用hashcode()和equals()方法来获取不同的元素。因此,我们的类必须实现hashcode()和equals()方法。

如果distinct()正在处理有序流,那么对于重复元素,将保留以遭遇顺序首先出现的元素,并且以这种方式选择不同元素是稳定的。

在无序流的情况下,不同元素的选择不一定是稳定的,是可以改变的。distinct()执行有状态的中间操作。

在有序流的并行流的情况下,保持distinct()的稳定性是需要很高的代价的,因为它需要大量的缓冲开销。如果我们不需要保持遭遇顺序的一致性,那么我们应该可以使用通过basestream.unordered()方法实现的无序流。

1. stream.distinct()

distinct()方法的声明如下:

stream<t> distinct()

它是stream接口的方法。在此示例中,我们有一个包含重复元素的字符串数据类型列表

distinctsimpledemo.java

output

no. of distinct elements:3

aa,bb,cc

2. stream.distinct() with list of objects

在此示例中,我们有一个book对象列表。 为了对列表进行去重,该类将重写hashcode()和equals()。

book.java

distinctwithuserobjects.java

output

3. distinct by property

distinct()不提供按照属性对对象列表进行去重的直接实现。它是基于hashcode()和equals()工作的。

如果我们想要按照对象的属性,对对象列表进行去重,我们可以通过其它方法来实现。

如下代码段所示:

上面的方法可以被stream接口的 filter()接收为参数,如下所示:

list.stream().filter(distinctbykey(b -> b.getname()));

distinctbykey()方法返回一个使用concurrenthashmap 来维护先前所见状态的 predicate 实例,如下是一个完整的使用对象属性来进行去重的示例。

distinctbyproperty.java

output

from : https://www.concretepage.com/java/jdk-8/java-8-distinct-example

补充知识:java.base/jdk.internal.loader.classloaders$appclassloader cannot be cast to java.base/java.net.urlcl

在设置项目的热部署时,需要添加对 spring-boot-devtools 的依赖,因为没有给定版本号,maven默认添加的是 v 1.5.8 版本。

当时安装jdk时,看到最新的 jdk-1.9, 就顺手安装了最新版本的jdk. 但是添加依赖之后,项目启动失败,报如下异常:

这个异常是因为老版本的 spring-boot-devtools 与最新版的 jdk之间不兼容,在网上找了找资料,关于这方面的资料没看到什么东西,上*上找了找,也不多,就找到一个相关的,链接如下:

大致描述如下:

in java 9 “application and extension class loaders are no longer instances of java.net.urlclassloader”, see “prepare for jdk 9”, alan bateman, oct 2015: http://openjdk.java.net/projects/jigsaw/talks/prepare-for-jdk9-j1-2015.pdf. i'm not sure where exactly the problem lies, if it's in httpunit itself or the jsp compiler libraries, but you might want to run some java 9 tests yourself.

application and extension class loaders are no longer instances of java.net.urlclassloader

意思是说,在 java 9中,应用程序和扩展类都不再是 java.net.urlclassloader 的实例。

将 spring-boot-devtools 版本换成 v2.0.0.m5 重新启动项目,异常消失,项目重新启动。

不过为了避免后面太多坑,果断将jdk版本回退到 1.8,回退之后,spring-boot-devtools v1.5.8时,项目正常启动,restart 和 livereload也设置成功,正常使用。

网上也有一些其他的解决方案,不过懒得折腾,以后遇到再看。

以上这篇java 8 stream.distinct() 列表去重的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。