Java8中新定义了一种接口类型,即函数式接口,与其他接口的区别就是:
-
函数式接口中只能有一个抽象方法(不包括与Object的方法重名的方法);
-
可以有从Object继承过来的抽象方法,因为所有类的最终父类都是Object;
-
接口中唯一抽象方法的命名并不重要,因为函数式接口就是对某一行为进行抽象,主要目的就是支持Lambda表达式。
Java8之前已经存在的函数式接口有:
-
java.lang.Runnable
-
java.util.concurrent.Callable
-
java.security.PrivilegedAction
-
java.util.Comparator
-
java.io.FileFilter
-
java.nio.file.PathMatcher
-
java.lang.reflect.InvocationHandler
-
java.beans.PropertyChangeListener
-
java.awt.event.ActionListener
-
javax.swing.event.ChangeListener
另外,Java8还提供了 @FunctionalInterface 注解来帮助我们标识函数式接口。另外需要注意的是函数式接口的目的是对某一个行为进行封装,某些接口可能只是巧合符合函数式接口的定义。