方法的引用-java8新特性
2016-03-07 13:18
169 查看
1. 什么是方法引用?方法引用是java8 新增的一种引用类型,java8之前,只有对象引用和java基本类型的引用。说的简单一点就是增加了一种引用类型,和java8之前的对象引用实质是一样的。2. 为什么要增加方法引用?主要目的是为了增加代码的可读性(easy to read)和简洁性(compact)。我们可以看一个例子,拿java集合中的排序方法来说。首先假设我们有一个Person对象的list, Person对象有一个生日的属性,我们以出生的先后顺序对Person List排序。
3. Java引用是如何进化的?参考文章:http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html我们以数组的排序方法为例,看一下,一个我们熟知的方法是怎么一步一步被写成方法引用的形式的。假设我们有一个Person对象的数组,我们要把Person对象的数组按照出生年月进行排序。Person类如下:
Person对象的数组如下:
Step 1:Java8之前的写法java8之前,方法的参数列表是不能引用方法的,只能引用对象或者基本数据类型。使用Array的sort方法进行排序,sort方法第二个参数需要一个继承Comparator接口的对象。所以,首先我们定义一个实现Comparator接口的类PersonAgeComparator.
Step
2:用java8新特性Lambda表达式实现Comparator是一个函数接口(functional interface)。我们就可以用Lambda表达式来实现这个接口。
在Lambda表达式中比较语句是:
Step3:方法引用(Method reference)实现Lambda表达式中引用了一个已经存在的方法,这个方法也可以用方法引用简写成下面的形式。
从上面一步一步走下来,我们可以把方法引用理解成为是Lambda表达式的简写形式。4. 什么样的方法才能使用方法引用?一个方法要调用另外一个方法,这个方法签名中的参数必须是一个函数接口(Functional Interface).我们拿java8新增加的包java.util.function中的IntBinaryOperator 接口来说。
IntBinaryOperator 这个接口就是一个函数接口,看一下这个接口的定义,只有一个方法,符合函数接口的定义。
所以oper这个方法在使用的地方就能够传入一个方法来进行调用。
这个过程可以这么简单的来理解,目前这方面的java教程还是比较少的。在java8之前,引用一个带有接口定义的方法,被引用的方法必须传入一个实现了这个接口的对象。如果这个接口中有两个方法,实现类的必须把这两个方法都进行实现,才完成了对接口的实现。Java8的方法引用实质上也是对这个接口的实现,只不过是比较简单的写法。所以方法引用的语法格式只能是只含有一个未实现方法的接口即函数接口。5.
方法引用的语法格式是什么样的?方法引用有哪些类型?语法格式: 方法引用是用::这个符号来实现的方法引用共有四种类型,我们举例子来说明。
3. Java引用是如何进化的?参考文章:http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html我们以数组的排序方法为例,看一下,一个我们熟知的方法是怎么一步一步被写成方法引用的形式的。假设我们有一个Person对象的数组,我们要把Person对象的数组按照出生年月进行排序。Person类如下:
2:用java8新特性Lambda表达式实现Comparator是一个函数接口(functional interface)。我们就可以用Lambda表达式来实现这个接口。
return
a.getBirthday().compareTo(b.getBirthday());
其实这个我们已经在Person类中有实现的方法。所以Lambda表达式也可以这么写:
IntBinaryOperator 这个接口就是一个函数接口,看一下这个接口的定义,只有一个方法,符合函数接口的定义。
方法引用的语法格式是什么样的?方法引用有哪些类型?语法格式: 方法引用是用::这个符号来实现的方法引用共有四种类型,我们举例子来说明。
类型 | Lambda表达式 | 方法引用 | 说明 |
类名直接引用一个静态方法(Reference to a static method) | ex.oper((a,b)->Example.mul(a, b), 1, 1); | ex.oper(Example::mul, 1, 2) | Example是上面示例的类名,mul是其一个静态方法。 |
对象引用非静态方法(Reference to an instance method of a particular object) | ex.oper((a, b)->ex.add(a, b), 1, 2) | ex.oper(ex::add, 1, 2) | ex是上面示例类的一个对象,add是其实例方法。 |
对象引用一个非静态方法(Reference to an instance method of an arbitrary object of a particular type) | ex.oper(s->s.toLowerCase(), "STRING") | ex.oper(String::toLowerCase, "STRING") | 用类名直接引用实例方法,toLowerCase是String类的一个示例方法。其实,在方法调用的过程中,已经传送了一个String的对象。 |
引用构造方法(Reference to a constructor) | ex.operC(()-> {return new GregorianCalendar();}) | ex.oper(GregorianCalendar::new) | 这个很简单,其实就是构造方法的简写。 |
相关文章推荐
- java启动停止脚本
- Java WebService 简单实例 (图文详解)
- Java实现冒泡排序算法
- javaWeb快速开发必备(三 spring配置)
- Java基础之线程心得(转)
- javaWeb快速开发必备(二 hibernate,jdbc相关配置)
- eclipse+SVN重输入用户名和密码
- [转]java 里面保留字volatile及其与synchronized的区别
- 2016蓝桥杯假期任务之《复数四则运算》
- JAVA基础——输出笔记
- Java中获取键盘输入值的三种方法
- 第一章 java基础
- javaWeb快速开发必备(一 web/struts配置)(ctrl+c,ctrl+v)
- UMEditor(UEditor缩减版)与Struts2集成实现富文本框粘贴图片
- Java 接口
- 《Java程序设计》 第一周学习总结
- Spring,hibernate,struts的面试笔试题
- 如何将Java项目做成windows服务
- java经典面试题struts,hibernate,spring
- 修改JAVA_HOME无效,java版本保持不变的问题解决