只包含一个抽象方法的接口,称为函数式接口,也称为SAM接口,即Single Abstract Method interfaces,用@FunctionalInterface注解进行标注,常见的函数式接口如Comparator,Runnable,Callable。
例子:
- @FunctionalInterface
- interface A {
- public void test(); // 只能包含一个抽象方法
- }
并且还可以使用泛型,如下:
- @FunctionalInterface
- interface A<T> {
- public void test(T t); // 只能包含一个抽象方法
- }
函数式接口不仅仅只定义一个抽象方法,还可以定义
下面以 Comparator函数式接口为例:

这里的 equals(Object obj)方法来自于java.lang.Object里的public方法boolean equals(Object obj);



函数式编程(Functional Programming)是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。历史上研究函数式编程的理论是Lambda演算,所以我们经常把支持函数式编程的编码风格称为Lambda表达式,Java从JDK1.8开始支持这种风格 ( 针对函数式接口的一种简单写法 )。
(1) 使用Lambda表达式
例子:
- @FunctionalInterface
- interface A {
-
- public void test(int a); // 只能包含一个抽象方法
- }
-
- class TestB {
-
- public static void Test(Integer num, A a) {
-
- a.test(num);
- }
-
- }
- // 使用匿名内部类
- TestB.Test(1, new A() {
-
- @Override
- public void test(int a) {
-
- System.out.println("【方式1】实现A接口的test方法,num="+a);
- }
- });
在以前对于这种 函数式接口参数 我们使用匿名匿名内部类的方式传递变量过去,从Java 8开始,我们可以用Lambda表达式进行简化。
- // 使用Lambda表达式
- TestB.Test(2,(int a)->