一、概述
函数式接口,顾名思义,万变都离不开接口这个身世。
那么先聊下 Java 中的接口:
首先,接口的设计一般是用于定义对象的扩展功能,而写法,接口内部也有且只能有若干个抽象方法。
但那些都是远古时期的啦(1.7及以前版本)。
而在 1.8 这个小小跨时代的版本之下,接口内部除了抽象方法,还能写有实现的静态方法和默认方法等,简单的例子就是 Comparator 这个接口,部分代码如下:
</p>
二、特性
函数式接口的特性是:
1、接口内部只能写一个抽象方法
2、抽象方法和静态方法的数量不限制
注意:
正如上文所提到的 Comparator 接口,也许你会好奇,如下图:
怎么会存在两个抽象方法?
其实 easy,这两个抽象方法是复写了顶级父类 Object 中的方法,而像这种父类的抽象方法,其实不在【唯一的抽象方法】限制内。
三、服务
其实,这个 FunctionalInterface 注解,是可有可无的,而它存在的目的,主要是用于 编译级错误检查,即,当你敲代码的时候,如果一个加了这个注解的接口内部的抽象方法不唯一会没有,它便会报异常,如下图:
所以总结:加不加 @FunctionalInterface 对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法
另外,其实这个函数式接口的设计,最最最最主要的,是为 Lambda 表达式服务的,至于 Lambda 表达式是什么,请点击 传送门。