浅析Java 8新特性Method Reference
什么是方法引用
我们知道了什么是Lambda Expression以及如何使用,那么,Method References又是什么呢?Oracle Java Docs中这样说:
They are compact, easy-to-read lambda expressions for methods that already have a name.
也就是说,它是把已经定义好的有名字的方法,当作Lambda Expression来使用。
它的常用语法为:className::methodName。
理解方法引用
通过一个例子来看:有一个数组,里面放了一堆Person对象,现在想要对它根据生日进行排序。
Person类
public class Person {
    LocalDate birthday;
    public Calendar getBirthday() {
        return birthday;
    }
    public static int compareByAge(Person a, Person b) {
        return a.birthday.compareTo(b.birthday);
    }
}
常规写法
Person[] rosterAsArray = roster.toArray(new Person[roster.size()]);
class PersonAgeComparator implements Comparator<Person> {
    public int compare(Person a, Person b) {
        return a.getBirthday().compareTo(b.getBirthday());
    }
}
Arrays.sort(rosterAsArray, new PersonAgeComparator());
Lambda Expression写法1:手动比较两个Date
Arrays.sort(rosterAsArray,
    (Person a, Person b) -> {
        return a.getBirthday().compareTo(b.getBirthday());
    }
);
分析这个Lambda Expression
- 首先,它overwrite了Comparator.compare()方法。
 - 然后,看一下compare()的参数:int compare(T o1, T o2),它的输入是两个类型一致的对象,返回值为int型。对应到表达式:
 - 左边:(Person a, Person b),定义了输入参数,两个Person类型的对象。
 - 右边:a.getBirthday().compareTo(b.getBirthday()),定义了输出参数,类型为int。
 
我们发现,对于右边,不一定要调用Date.compareTo()方法,其他任意自定义的方法都可以,只需要满足输入输出参数一致即可。
正好,Person类里面已经定义了一个compareByAge()方法可以直接拿过来替换。于是,可以改成这样:
Lambda Expression写法2:调用已经定义好的方法
Arrays.sort(rosterAsArray,
    (Person a, Person b) -> {
        return Person.compareByAge(a, b);
    }
);
再对其分析,可以发现,左边(Person a, Person b)其实是冗余信息,因为右边Person.compareByAge(a, b)方法已经定义好了输入输出。
所以,上面的代码可以简化如下:
Method Reference写法
Arrays.sort(rosterAsArray, Person::compareByAge);
几种类型
Method Reference有以下几种类型:
- 引用静态方法: 
ClassName::staticMethodName - 引用构造方法: 
ClassName::new - 引用某个实例上的实例方法应用: 
instanceReference::instanceMethodName - 引用某个类型上的实例方法引用: 
ClassName::instanceMethodName 
在使用“某个类型上的实例方法引用”时,需要传入实例化参数;而在使用“某个实例上的实例方法应用”时,因为已经实例化过了所以并不需要。
链接
- https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
 - https://www.zhihu.com/question/54665934
 - https://www.cnblogs.com/JohnTsai/p/5806194.html
 
浅析Java 8新特性Method Reference的更多相关文章
- 浅析Java 8新特性Lambda Expression
		
什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...
 - Java 8新特性解读
		
(四)Java 8 相关知识 关于 Java 8 中新知识点,面试官会让你说说 Java 8 你了解多少,下面分享一我收集的 Java 8 新增的知识点的内容,前排申明引用自:Java8新特性及使用 ...
 - Java 8 新特性终极版
		
声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...
 - Java 8新特性前瞻
		
快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...
 - Java 8 新特性1-函数式接口
		
Java 8 新特性1-函数式接口 (原) Lambda表达式基本结构: (param1,param2,param3) -> {代码块} 例1: package com.demo.jdk8; i ...
 - 【整理】Java 8新特性总结
		
闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...
 - 一小时上手Java 8新特性
		
一小时上手Java 8新特性 本文摘译自 https://www.journaldev.com/2389/java-8-features-with-examples,并做了适当增补. Iterable ...
 - Java 8 新特性:1-函数式接口
		
(原) Java 8 新特性1-函数式接口 Lambda表达式基本结构: (param1,param2,param3) -> {代码块} Lambda表达式结构: (type1 arg1,typ ...
 - Java 8新特性之旅:使用Stream API处理集合
		
在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...
 
随机推荐
- DOM备忘录
			
nodeName和nodeValue属性 对于element节点而言,nodeName是标签名,nodeValue是null:而对于textNode节点而言,nodeName是#Text,nodeVl ...
 - shell 脚本中执行SQL语句 -e "..."
			
/usr/local/mysql/bin/mysql -uroot -p123456 -e " use faygo source faygo.sql select * from devqui ...
 - bzoj 3669: [Noi2014]魔法森林
			
bzoj 3669: [Noi2014]魔法森林 Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号 ...
 - python爬虫循环导入MySql数据库
			
1.开发环境 操作系统:win10 Python 版本:Python 3.5.2 MySQL:5.5.53 2.用到的模块 没有的话使用pip进行安装:pip install xxx ...
 - 借腾讯开源 VasDolly,谈谈 Android 签名和多渠道打包的原理!
			
一.前言 Hi,大家好,我是承香墨影! 当我们需要发布一款 App 到应用市场的时候,一般需要我们针对不同的市场生产不同的渠道包,它们使用的是同一套代码,只是会包含一些各自的渠道信息,用于我们做数据分 ...
 - Java经典编程题50道之三十二
			
取一个整数a从右端开始的4-7位. public class Example32 { public static void main(String[] args) { cut(12 ...
 - Yii2 灵活加载js、css
			
Yii2.0对于CSS/js 管理,使用AssetBundle资源包类. 视图如何按需加载CSS/JS ? 资源包定义: backend/assets/AppAsset.PHP <?php na ...
 - HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二
			
思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...
 - 【BZOJ3309】DZY Loves Math
			
Time Limit: 5000 ms Memory Limit: 512 MB Description  对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * ...
 - MongoDB的DBREF 使用.
			
首先要记一下根据 DBREF 的ObjectId 以及根据 ref 集合为条件查询问题. 在不同的可视化客户端里面显示的问题. //某客户端显示这样,直接CMD查询也是这样显示.这样我无法看懂find ...