`

JDK8 Stream操作 collectingAndThen ------根据对象的属性进行去重操作

    博客分类:
  • java
 
阅读更多

https://blog.csdn.net/qq_35634181/article/details/108867857

 https://blog.csdn.net/weixin_41405524/article/details/120717488

 

 ExportTemperatureDto实体对象:

 

@Getter

@Setter

@ToString

public class ExportTemperatureDto {

    private String name;

    private Double morningTemperature;

    private Double afternoonTemperature;

    private String classId;

    private String gradeId;

    private Integer personId;

}

        在一个ExportTemperatureDto的集合中,根据personId属性去重,生成一个新的集合。

 

import static java.util.Comparator.comparing;

import static java.util.stream.Collectors.collectingAndThen;

import static java.util.stream.Collectors.toCollection;

 

public class StreamTest {

 

    public static void main(String[] args) {

        List<ExportTemperatureDto> temperatureList = Lists.newArrayList();

        temperatureList.add(new ExportTemperatureDto(1, "haha"));

        temperatureList.add(new ExportTemperatureDto(2, "haha"));

        temperatureList.add(new ExportTemperatureDto(3, "haha"));

        temperatureList.add(new ExportTemperatureDto(4, "haha"));

 

        temperatureList.add(new ExportTemperatureDto(1, "hahaasdas"));

        temperatureList.add(new ExportTemperatureDto(2, "hahaasdas"));

 

        List<ExportTemperatureDto> result = temperatureList.stream()

                .collect(

                        collectingAndThen(

                                toCollection(

                                        () -> new TreeSet<>(comparing(ExportTemperatureDto::getPersonId))

                                ),

                                ArrayList::new

                        )

                );

 

        result.forEach(System.out::println);

 

        /*

            输出结果为:

                ExportTemperatureDto(personId=1, name=haha)

                ExportTemperatureDto(personId=2, name=haha)

                ExportTemperatureDto(personId=3, name=haha)

                ExportTemperatureDto(personId=4, name=haha)

            因为TreeSet底层是使用TreeMap进行实现的,传入了根据getPersonId进行比较的比较器

            在判断personId相同时,其比较结果为0,然后就会替换其value值,而key值是不会变化的,

            又因为TreeSet是将传入的元素作为key的,所以使用TreeSet时,当比较器比较的结果相同时,以不会将原来的值替换成比较后的值

         */

 

    }

}

         知其然知其所以然,这个stream流的操作看起来还是有点难度的,这里记录一下。

 

         使用到了collectingAndThen完成根据属性进行去重的操作,对于该去重操作的关键使用到了collectingAndThen、toCollection、TreeSet,有点难以理解,当时我也是懵逼的,这里记录一下,以后肯定还会用的到。

 

         理解根据对象的属性进行去重的核心是,将集合放到TreeSet中,然后再将TreeSet转为List, 其中TreeSet要传入一个根据哪个属性进行比较的比较器,然后使用public ArrayList(Collection<? extends E> c)将TreeSet放入构造器中生成List。

 

         上面的Stream操作可以使用普通的集合:

 

TreeSet<ExportTemperatureDto> treeSet = new TreeSet<>(Comparator.comparing(ExportTemperatureDto::getPersonId));

for (ExportTemperatureDto temperatureDto : temperatureList){

    treeSet.add(temperatureDto);

}

List<ExportTemperatureDto> result2 =  new ArrayList<>(treeSet);

          只要能够理解普通集合怎么操作的,那么使用Stream流操作时,就是要看对于API的使用是否熟悉,其实这个才是关键,只有理解了collectingAndThen、toCollection、JDK8的匿名函数这样内容,才能看懂这个式子。

 

         下面就简单介绍一下:

 

         首先说一下collectingAndThen方法的使用-------先进行结果集的收集,然后将收集到的结果集进行下一步的处理,红字的两句话是理解collectingAndThen的关键,首先看一下collectingAndThen需要传递的参数:

 

public static<T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream,

                                                          Function<R,RR> finisher) 

        可以看到第一个参数是Collector接口的子类,所以还是对于对于Collector的处理,Collectors工具类里面的toList()、toSet()、joining()、mapping()、collectingAndThen()等几乎所有的方法都可以使用,这样感觉这个collectingAndThen就很强大了,可以嵌套的去使用。   第二个参数是一个Function函数,熟悉的同学都知道,Function函数是这样的:R apply(T t),这个也是理解上面去重式子的关键,原来我想的是ArrayList::new调用的无参的构造方法,其实他调用的ArrayList的有参构造方法,

 

public ArrayList(Collection<? extends E> c)

 

         调用的是上面那个构造方法,这样就很清晰,就是把第一个参数downstream的结果,交给第二个参数Function函数的参数里面,R apply(T t),也就是将结果设置成t。

 

         对于toCollection是一个通用的转为集合的操作,当然在Collectors类里面也有toList()、toSet()方法,但是都不满足于使用TreeSet来收集集合的方法,所以使用toCollection是一个通用的方法,使用TreeSet进行收集,然后传入根据哪个属性进行比较的比较器,这样就可以了。

分享到:
评论

相关推荐

    jdk-8u131-windows-x64

    jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...

    jdk-8u311-windows-x64.exe

    jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...

    jdk-8u131-windows-i586

    8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-8u131-windows-i586jdk-...

    jdk-8u301-linux.zip

    (1)jdk-8u301-linux-aarch64.rpm (2)jdk-8u301-linux-aarch64.tar.gz (3)jdk-8u301-linux-arm32-vfp-hflt.tar.gz (4)jdk-8u301-linux-i586.rpm (5)jdk-8u301-linux-i586.tar.gz (6)jdk-8u301-linux-x64....

    java-jdk1.8-8u361-all-jdk-win-linux

    jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8u361-linux-i586.tar.gz jdk-8u361-linux-x64.rpm jdk-8u361-linux-x64.tar.gz jdk-8u361-windows-i586.exe jdk-8u361-windows-x64.exe 如果需要mac版本...

    开发工具 jdk-8u121-windows-i586

    开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...

    jdk-8u261-linux-x64.tar linux jdk

    标题 "jdk-8u261-linux-x64.tar linux jdk" 提供的信息是关于Java Development Kit(JDK)的版本号以及适用于Linux操作系统的64位版本。描述 "JDK java jar 包最新 下载解压即可 jdk-8u261-linux-x64.tarjdk-8u261-...

    jdk8 jdk-8u251-windows-x64 百度网盘下载

    官方下载链接:https://download.oracle.com/otn/java/jdk/8u251-b08/3d5a2bb8f8d4428bbe94aed7ec7ae784/jdk-8u251-windows-x64.exe 觉得慢的话可以用txt里百度网盘下载,附件为...jdk8 jdk-8u251-windows-x64 网盘下载

    jdk-8u171-linux-x64.rpm/jdk-8u171-linux-x64.tar.gz

    本主题涉及两个特定于Linux平台的JDK版本:jdk-8u171-linux-x64.rpm和jdk-8u171-linux-x64.tar.gz。这两个文件分别对应于两种不同的安装方式,适应于不同类型的Linux系统需求。 首先,`jdk-8u171-linux-x64.rpm`是...

    jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe、jdk-14.0.1_windows-x64_bin.e

    本话题涉及三个不同版本的JDK:jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe以及jdk-14.0.1_windows-x64_bin.exe,分别对应Java 8的两个更新版本和Java 14的一个版本。 首先,让我们详细了解一下Java 8。...

    jdk-8u131-macosx-x64

    8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-8u131-macosx-x64jdk-...

    jdk-8u131-windows-x32下载【官方纯净版】

    jdk-8u131-windows-x32下载 - 官方纯净版【带环境变量配置 视频教学】 环境变量自己配置方法www.foxconnpx.cn/newsinfo-165.html jdk-8u131-windows-x32下载 - 官方纯净版【带环境变量配置 视频教学】 jdk-8u131-...

    jdk-8-linux-x64.rar

    标签“jdk-8-linux-x64”简洁地概括了这个软件包的主要属性,即与JDK 8、Linux操作系统和64位架构相关。 在压缩包内,我们看到一个名为“jdk-8-linux-x64.rpm”的文件,这是实际的JDK RPM软件包。用户可以通过...

    jdk8安装包: jdk-8u202-windows-x64

    这里的"jdk-8u202-windows-x64"是一个针对Windows 64位操作系统的JDK 8更新202版本的安装包。在本文中,我们将深入探讨JDK 8的重要特性和安装过程。 首先,JDK 8是Oracle公司发布的Java平台标准版(Java SE)的一个...

    jdk-8u221-windows-x64.rar

    jdk-8u221-windows-x64.exe 支持Win10 64位 jdk-8u221-windows-x64.exe 支持Win10 64位 jdk-8u221-windows-x64.exe 支持Win10 64位 jdk-8u221-windows-x64.exe 支持Win10 64位 jdk-8u221-windows-x64.exe 支持Win10...

    jdk-8u401-windows-x64.exe

    标题中的"jdk-8u401-windows-x64.exe"指的是Java Development Kit(JDK)的8u401版本,专为64位Windows操作系统设计。JDK是Java编程语言的核心组件,包含了编译器、调试工具、运行环境等,使开发者能够在本地环境中...

    jdk-8u151-windows-x64

    标题“jdk-8u151-windows-x64”指的是Java Development Kit(JDK)的第8个更新版本151,专为Windows操作系统64位架构设计的安装程序。JDK是Java编程语言的核心工具集,用于开发、编译、调试和运行Java应用程序。这个...

    jdk-8u341-linux-x64安装包

    在这个场景中,我们有两个版本的JDK 8u341针对Linux操作系统的安装包:`jdk-8u341-linux-x64.rpm` 和 `jdk-8u341-linux-x64.tar.gz`。 1. **RPM 包格式**: `jdk-8u341-linux-x64.rpm` 是一个遵循Red Hat Package ...

    jdk-8u162-linux-x64.tar.zip

    标题中的“jdk-8u162-linux-x64.tar.zip”揭示了这是一个与Java开发工具包(JDK)相关的文件,特别指出是版本8的更新162(u162),针对Linux操作系统的64位架构。JDK是Java编程语言的核心组件,包含了编译器、调试器...

    jdk-8u281-linux-x64.tar.gz.zip

    1.下载后重命名:jdk-8u281-linux-x64.tar.gz 2.解压 tar -zxvf jdk-8u281-linux-x64.tar.gz 3.配置环境变量:vim /etc/profile 最后添加: export JAVA_HOME=/opt/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$...

Global site tag (gtag.js) - Google Analytics