JAVA8新特性学习手稿

函数式接口

在面向过程语言C和C++中,我们通常会用到函数来实现一些特定的功能,而在JAVA中,因为所有函数都是依赖于对象,所以引出了函数式接口的设计。
定义:如果一个接口只定义了唯一一个抽象方法,那么这个接口就成为函数式接口。
(ps:这个接口可以有多个非抽象方法)
通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行。同时,引入了一个新的注解:@FunctionalInterface。可以把它放在一个接口前,表示这个接口是一个函数式接口。这个注解是非必须的,只要接口只包含唯一一个抽象方法,虚拟机会自动判断,不过最好在接口上使用注解 @FunctionalInterface 进行声明。在接口中添加了
@FunctionalInterface 的接口,只允许有一个抽象方法,否则编译器也会报错。

函数式接口的实例可以通过lambda表达式,方法引用或者构造方法来创建。
eg:
JAVA8新特性学习手稿
主要语法
1.() -> 代表了 lambda的一个表达式
2. 单行代码无需写return (无论函数式接口有没有返回值),花括号
3. 多行代码必须写花括号,有返回值的一定要写返回值
4.单行代码且有参数的情况下可以不写 () 如 s->System.out.println(s)

Lambda表达式

应用在SAM(Single Abstract Method,含有一个抽象方法的接口)环境下的一种简化定义形式,同于解决匿名内部类的定义复杂问题。

组成部分:

第一部分为一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数;

第二部分为一个箭头符号->。

第三部分为方法体,可以是表达式或代码块。

如果方法体为表达式,返回值就是该表达式的值。

如果方法体为代码块,必须用{}来包裹起来,且需要一个return返回值,

但若函数式接口里面方法返回值是void,那么不需要返回值。

在给定的格式中,参数要与覆写的抽象方法的参数对应,抽象方法的具体操作就通过方法体来进行定义。

Eg:

JAVA8新特性学习手稿

接口默认方法default-method

默认方法允许您添加新的功能到现有库的接口中,并能确保与采用旧版本接口编写的代码的二进制兼容性。

默认方法是在接口中的方法签名前加上了 default 关键字的实现方法。

Eg:
JAVA8新特性学习手稿

该程序在p接口中利用default定义了普通方法,这样接口的组成就不再只有抽象方法,同时这些default定义的普通方法也可以直接被子类继承.

默认方法的必要性:

在java8之前,接口与其实现类之间的耦合度太高了(tightly
coupled)。当需要为一个接口添加方法时,所有的实现类都必须随之修改。默认方法解决了这个问题,它可以为接口添加新的方法,而不会破坏已有的接口的实现。这在
lambda 表达式作为
java 8 语言的重要特性而出现之际,为升级旧接口且保持向后兼容(backward
compatibility)提供了途径。

JAVA8新特性学习手稿

接口static方法

该程序在IMessage接口中定义了一个static方法getInstance(),此方法可以直接被接口名称调用,主要的作用是获取接口实例化对象.

使用default定义的普通方法需要通过接口实例化对象才可以调用,而为了避免对实例化对象的依赖,在JAVA8中新添加了接口的static方法,此方法可以直接通过接口名称调用.
JAVA8新特性学习手稿

参考文献:
http://ebnbin.com/2015/12/20/java-8-default-methods/
https://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/
https://www.runoob.com/java/java8-functional-interfaces.html