Lambda方法推导(method references)

时间:2022-01-09 19:00:21

在上一篇【http://www.cnblogs.com/webor2006/p/7707281.html】中提到了方法推导的东东:

Lambda方法推导(method references)

这里说细的学习一下它,下面走起!

Method references【方法推导】:

Lambda方法推导(method references)

编译运行:

Lambda方法推导(method references)

而对于上面的代码可以用Lambda更加精简:

Lambda方法推导(method references)

不多解释,然后对于上面的代码还能进一步精简,这时就得用到Lambda的方法推导啦,如下:

Lambda方法推导(method references)

可以打一下println()的方法源码:

Lambda方法推导(method references)

而方法推导的使用方式就是类后面加两个":",再跟上要调用的方法名。

其实在JAVA8 IN ACTION中就有一节专门介绍方法推断的,其中描述了在下列三种情况下可以改用方法推断,如下:

Lambda方法推导(method references)

1. A method reference to a static method (for example, the method parseInt of Integer, written Integer::parseInt) 

 上面已经说明了这种情况,比如Integer.parseInf()方法是静态的,平常我们也大量会使用到它,这时它就可以用方法推荐的方式编写,具体如下:

Lambda方法推导(method references)

2. A method reference to an instance method of an arbitrary type (for example, the method length of a String, written String::length) 

一个对象的方法也可以用推导,如描述中所举例的String对象的length方法,这里用它的另外一个方法来举例,charAt:

Lambda方法推导(method references)

其结果输出是一样的:

Lambda方法推导(method references)

【注】:这里是用的String::charAt,也就是用的String的类,而非类的实例,它跟第三点有点不一样。

3. A method reference to an instance method of an existing object (for example, suppose you have a local variable expensiveTransaction that holds an object of type Transaction, which supports an instance method getValue; you can write expensiveTransaction::getValue) 

还是以上面String的charAt为例,以实例的方式如下:

Lambda方法推导(method references)

Constructor references【构造函数方法推导】:

在上节中提到的String::new的推导也就是属于这种,也就是对像的实例可以用推导的方式来写,再来复习下:

Lambda方法推导(method references)

上面这个是调用无参的构造函数,但如果存在二个构造参数如何用推导的方式呢,这里还是以之前咱们写的Apple为例:

Lambda方法推导(method references)

Lambda方法推导(method references)

那如果构造存在三个参数怎么办呢?系统的Function貌似也就最多支持二个输入参,这时咱们可以自己手写Function,这里先来定义一个三个参数的Apple实体:

Lambda方法推导(method references)

这时定义咱们自己的Function,如下:

Lambda方法推导(method references)

接着来实例化三个参数的Apple如下:

Lambda方法推导(method references)

Lambda方法推导(method references)

下面再来看另外一个例子:

Lambda方法推导(method references)

编译运行:

Lambda方法推导(method references)

其实对于数组的排序还有另外一种更加简便的写法,其中也涉及到了方法的推导,如下:

Lambda方法推导(method references)

Lambda方法推导(method references)

查看一下Comparator.comparing()的源码理解一下它的原理:

Lambda方法推导(method references)

Lambda方法推导(method references)

而传的Apple::getColor返回的:

Lambda方法推导(method references)

所以keyExtractor.apply(c1=Apple)就刚好返回的是c1的color,所以上面可以等于(c1, c2) -> c1.color.compareTo(c2.color),其实也就是等价于这种方式:

Lambda方法推导(method references)

对于这个源码有个大概的印象,以便可以知其所有然。

对于对集合进行排序可以把目前的三种写法列出来直观感受一下:

Lambda方法推导(method references)

 是不是推出的新的写法就是为了让代码更加的精简呢~~至此对于Java8的Lambda表达式相关的东东就学得差不多了,需好好消化。