比较器详解:

这次来对比较器进行一个学习,比较器(Comparator)这个是在JDK1.2就提出的概念,只是说JAVA8针对它进行了一定的扩充,更加方便咱们使用,其中唯一的抽象方法如下:

而JAVA8中对这个接口进行扩展的当然就是一些默认或静态方法啦,如:

下面来粗略的来了解一下这新增的具体实现的方法,其实大体有三大类:

首先看一下reversed(),从字面意思就是对其顺序进行反序嘛:

有了这个辅助方法,其实如果想对其逆序排序的话,就不需要再次创建Comparator对象啦,直接调用这个方法既可,更加的方便人性。

接着再来看第二大类:comparing()相关,其中有通用的方法,也有具化的,根据使用原则,能用具化的方式就用具化的方式,因为具化的方法比通用的方法性能要优:

最后再来看一下:thenComparing(),那这个方法主要是用来干嘛的呢?下面举个场景:

比如学生有姓名和年龄属性,对其学生集合进行比较的话,可能存在这样的一个比较规则:首先根据学生年龄进行升序排序,这时势必会有多个学生的年龄是一样的,这时可能需要对相同年龄的同学再用它的名字进行进一步排序,相当于是比较的一种串联,可以多次进行比较,这个方法就是用来解决这种场景而生的。

相当它也存在具化的方法,如下:

接下来则用代码进行说明,目的是为了对其比较器有一个更加深刻的认识:

对如下集合进行升序排序:

可以采用默认排序规则,如下:

接下来对其进行改造,这时按字符串的长度进行升序排序,如下:

继续改造,按字符串的长度的降序排序,如下:

接着还是按长度降序排列,这时采用方法引用,及Comparator接口提供的一些现有的方法来实现,如下:

编译运行:

很显然不符合咱们的要求:长度降序排列,这时可以调用比较器里面现成的逆序方式来实现,如下:

类型推断特例:

接下来咱们用Lambda表达式的方式来代替上面的方法引用来实现同样的功能,如下:

可以按command+左键看一上目前item是个啥类型:

是Object类型而非String,为啥是Object类型呢?明显应该是可以类型推导成String呀,先不探究其原因,先来解决这个问题,之前在学习Lambda表达式时也提到过,对于系统无法推导出来的类型则需要显示的进行类型声明,所以可以修改代码如下:

这算是一个类型推断的特例,那下面来找出原因为啥这种情况是无法推断的, 下面如果这么写这可以正常编译了,如下:

这是为啥呢?这是个很细的东东,可以看一下如果加了reversed()方法之后,其sort的第二个参数其实是由reversed()调用之后才返回的,也就是它相对于上下文是比较远的,因为相当于隔了两层,而如果将reversed()去掉就可正常编译的原因是因为此时sort的第二个参数是由Comparator.comparingInt()方法来返回的,而它相对于上下文是比较近的,就只有一层嘛,那为啥当加了reversed()之后将item就默认它为Object类型了呢?这时需要看一下Comparator.comparingInt()参数的定义了,看下源码:

而对于String来说,它的父类就是Object,当系统抢断不出来元素类型是String,那肯定就把类型当成Object啦。

java8学习之比较器详解与类型推断特例的更多相关文章

  1. Java8 Stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

  2. 跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码

    跟我学机器视觉-HALCON学习例程中文详解-QQ摄像头读取条码 第一步:插入QQ摄像头,安装好驱动(有的可能免驱动) 第二步:打开HDevelop,点击助手-打开新的Image Acquisitio ...

  3. 从51跳cortex-m0学习2——程序详解

    跳cortex-m0——思想转变>之后又一入门级文章,在此不敢请老鸟们过目.不过要是老鸟们低头瞅了一眼,发现错误,还请教育之,那更是感激不尽.与Cortex在某些操作方式上的异同,让自己对Cor ...

  4. Atitit.jdk java8的语法特性详解 attilax 总结

    Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...

  5. iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINavigati ...

  6. [转]iOS学习之UINavigationController详解与使用(三)ToolBar

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682641 iOS学习之UINavigationController详解与使用(二)页面切 ...

  7. [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...

  8. 各大公司广泛使用的在线学习算法FTRL详解

    各大公司广泛使用的在线学习算法FTRL详解 现在做在线学习和CTR常常会用到逻辑回归( Logistic Regression),而传统的批量(batch)算法无法有效地处理超大规模的数据集和在线数据 ...

  9. 跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量 * This example program demonstrates the basic usage of a fuzz ...

随机推荐

  1. python网络编程(Socket、TCP、UDP)

    Socket 是网络编程的一个抽象概念,通常我们用一个Socket表示 "打开了一个网络链接",而打开一个Socket 需要知道目标计算机的IP 地址和端口号,再指定协议类型即可. ...

  2. 基于nodeJS的小说爬虫实战

    背景与需求分析 最近迷恋于王者荣耀.斗鱼直播与B站吃播视频,中毒太深,下班之后无心看书. 为了摆脱现状,能习惯看书,我开始看小说了,然而小说网站广告多而烦,屌丝心态不愿充钱,于是想到了爬虫. 功能分析 ...

  3. ES5与ES6常用语法教程之 ②解构语法糖、声明变量异同

    js常用语法系列教程如下 es5与es6常用语法教程(1) es5与es6常用语法教程(2) es5与es6常用语法教程(3) es5与es6常用语法教程(4) es5与es6常用语法教程(5) es ...

  4. 英特尔® 图形性能分析器 2019 R1 版本

    了解并下载全新英特尔® 图形性能分析器 2019 R1 版本.新版本新增了 DX11 和 Vulkan 多帧流捕获模式,可以在“帧和图形跟踪分析器”中分析 Vulkan 应用.此外,帧分析器还添加了 ...

  5. Codeforces Round #594 (Div. 2)(A/B/C)

    A. Integer PointsDescription DLS and JLS are bored with a Math lesson. In order to entertain themsel ...

  6. Java小知识----List复制:浅拷贝与深拷贝

    原文地址: https://blog.csdn.net/demonliuhui/article/details/54572908 List浅拷贝 众所周知,list本质上是数组,而数组的是以地址的形式 ...

  7. [转帖]深度: NVMe SSD存储性能有哪些影响因素?

    深度: NVMe SSD存储性能有哪些影响因素? http://www.itpub.net/2019/07/17/2434/ 之前有一个误解 不明白NVME 到底如何在队列深度大的情况下来提高性能, ...

  8. python list 中extend()与append()区别

    def changextend(str): "print string with extend" mylist.extend([40,50,60]); print(mylist) ...

  9. .Net高并发解决思路

    转自: 本文如有不对之处,欢迎各位拍砖扶正.另源码在文章最下面,大家下载过后先还原一下nuget包,需要改一下redis的配置,rabbitmq的配置以及Ef的连接字符串.另外使用的是CodeFirs ...

  10. RSA 加密长度计算公式

    The length of data that can be encrypted using RSA is determined primarily by the size of the key yo ...