作者:goodluckwj\
起源:blog.csdn.net/qq_35634181/article/details/108867857

ExportTemperatureDto实体对象:

@Getter@Setter@ToStringpublic 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);         /*            输入后果为:                personId为1的,其名称为haha                personId为2的,其名称为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进行收集,而后传入依据哪个属性进行比拟的比拟器,这样就能够了。

近期热文举荐:

1.1,000+ 道 Java面试题及答案整顿(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!