函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
可以使用@FunctionalInterface注解来声明定义函数式接口。
例如:
@FunctionalInterface
public interface MyFunctionInterface {
//抽象方法
void fn();
//静态方法
static void m(){
}
//默认方法
default void defaultMethod() {
//implement code
}
}
//可以使用匿名内部类实现函数式接口。
public class Test {
public static void main(String[] args) {
MyFunctionInterface inter = new MyFunctionInterface() {
@Override
public void fn() {
System.out.println("实现了 fn()....");
}
};
inter.fn();
}
}
运行结果:
实现了 fn()....
Lambda表达式允许直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实现。 例如:上面的MyFunctionInterface使用Lambda表达式实现如下。
public class Test {
public static void main(String[] args) {
MyFunctionInterface inter = ()-> System.out.println("实现了 fn()....");
inter.fn();
}
}
运行结果:
实现了 fn()....
Lambda入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符 箭头操作符将Lambda 表达式拆分成两部分: 左侧:Lambda 表达式的参数列表 右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体。 语法格式一:无参数,无返回值
void fn();
() -> System.out.println("Hello Lambda!");
语法格式二:有一个参数,并且无返回值
void fn(int x);
(x) -> System.out.println("Hello Lambda!");
//小括号也可以省略不写
x->System.out.println("Hello Lambda!");
语法格式三:有两个以上的参数,有返回值
int add(int x,int y);
(x,y)->{retrun x+y;};
//若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写 即
(x,y)->x+y;
1)有且仅有一个抽象方法,但是可以有多个非抽象方法的接口成为函数式接口,可以使用@FunctionalInterface来检查是否符合函数式接口的要求。
2)函数式接口只能是接口不能是抽象类。
3)对于函数式接口可以使用Lambda表达式实现。Lambda表达式的出现,意味着Java往函数式编程又迈进了一小步。