当前位置: 首页 > 后端技术 > Java

致命的Lambda表达式(五):比较化合物

时间:2023-04-01 19:15:53 Java

给文明时间,不给文明时间。——《三体》在上一篇文章(传送门)中,我们介绍了JDK提供的常用功能接口。JDK不仅提供了这些功能接口,其中一些还为我们提供了实用的默认方法。本次我们将介绍Comparator的组成。Comparator的使用在上一篇的例子中,我们使用了Comparator.comparing静态方法构造了Comparator接口的实例,这里再简单介绍一下。先来看看Mask类是怎么写的:packageone.more.study;/***口罩*@author万猫学社*/publicclassMask{publicMask(){}publicMask(Stringbrand,Stringtype,双倍价格){this.brand=brand;this.type=类型;这个。价格=价格;}/***品牌*/privateStringbrand;/***类型*/privateStringtype;/***价格*/privatedoubleprice;publicStringgetBrand(){返回品牌;}publicvoidsetBrand(Stringbrand){this.brand=brand;}publicStringgetType(){返回类型;}publicvoidsetType(Stringtype){this.type=type;}publicdoublegetPrice(){返回价格;}publicvoidsetPrice(doubleprice){this.price=price;}@OverridepublicStringtoString(){return"Mask{"+"brand='"+brand+'\''+",type='"+type+'\''+",价格="+价格+'}';}}然后,将口罩列表按照口罩品牌正序排序:ListmaskList=newArrayList<>();maskList.add(newMask("3M","KN95",17.8));maskList.add(新面罩("霍尼韦尔","KN95",18.8));maskList.add(新面罩("3M","FFP2",19.8));maskList.add(新面罩("霍尼韦尔","N95",19.5));maskList.sort(Comparator.comparing(Mask::getBrand));for(Maskmask:maskList){System.out.println(mask);}run结果如下:Mask{brand='3M',type='KN95',price=17.8}Mask{brand='3M',type='FFP2',price=19.8}Mask{brand='Honeywell',type='KN95',price=18.8}Mask{brand='Honeywell',type='N95',price=19.5}倒序要求已更改,要求按口罩品牌倒序排列。这是否需要构建一个Comparator接口实例呢?答案是否定的,Comparator接口默认有一个方法reversed可以颠倒顺序。稍微修改上面的例子:maskList.sort(Comparator.comparing(Mask::getBrand).reversed());运行结果如下:Mask{brand='Honeywell',type='KN95',price=18.8}Mask{brand='Honeywell',type='N95',price=19.5}Mask{brand='3M',type='KN95',price=17.8}Mask{brand='3M',type='FFP2',price=19.8}比较链的需求又变了,先根据以面膜品牌倒序排列。如果口罩品牌相同,则按照口罩类型正序排序。Comparator接口也有一个默认方法thenComparing来执行此操作。它的输入参数也是Function接口的一个实例。再次比较当前比较器,让我们再次修改上面的例子:maskList.sort(Comparator.comparing(Mask::getBrand).reversed().thenComparing(Mask::getType));运行结果如下:Mask{brand='Honeywell',type='KN95',price=18.8}Mask{brand='Honeywell',type='N95',price=19.5}Mask{brand='3M',type='FFP2',price=19.8}Mask{brand='3M',type='KN95',price=17.8}需求又变了,先按口罩品牌倒序排序,如果口罩品牌是同样,然后按掩码价格按正序排序。口罩的价格是双层的。如果使用thenComparing,会造成自动装箱,造成资源浪费。因此,推荐使用thenComparingDouble方法,入参为ToDoubleFunction,代码修改如下:maskList.sort(Comparator.comparing(Mask::getBrand).reversed().thenComparingDouble(Mask::getPrice));运行结果如下:Mask{brand='Honeywell',type='KN95',price=18.8}Mask{brand='Honeywell',type='N95',price=19.5}Mask{brand='3M',type='KN95',price=17.8}Mask{brand='3M',type='FFP2',price=19.8}类似的支持基本数据类型的方法有两个,分别是:thenComparingInt方法,入参为ToIntFunction;thenComparingLong方法,其入参为ToLongFunction。总结默认方法名输入参数输入参数签名反向逆序nonenonethenComparingcomparatorchainFunction(T)->RthenComparingIntcomparatorchainToIntFunction(T)->intthenComparingLongcomparatorchainToLongFunction(T)->longhenComparingDoublecomparatorchainToDoubleFunction(T)->双