Java 8 Stream.distinct() 列表去重的操作
在这篇文章里,我们将提供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() 列表去重的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
java8 Stream 一行代码实现列表去重
-
java8 Stream 一行代码实现列表去重
-
Java8-Stream流操作List去重distinct、和指定字段去重(完整实例讲解)
-
Java8使用stream实现list中对象属性的合并(去重并求和)
-
关于java的List集合对象去重及按属性去重的8种方法
-
java8实现List中对象属性的去重方法
-
java8 流操作 List去重
-
Java8-Stream流操作List去重distinct、和指定字段去重(完整实例讲解)
-
Java 8 Stream.distinct() 列表去重的操作
-
如何实现java8 list按照元素的某个字段去重