概念
函数式接口指的是:有且只有一个抽象方法的接口
函数式接口,适用于函数式编程场景的接口。而java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。
定义一个函数式接口
这样就定义了一个函数式接口
但是一个接口是可以有多个抽象方法的
要如何确定自己定义的的确是一个函数式接口呢
如下图,他是不能被当做函数式接口的,因为有多个抽象方法
这个时候我们就要用到一个注解@FunctionalInterface
打上这个注解之后立马报错了
然后删掉method2方法呢
就没有任何报错了
所以@FunctionalInterface
注解的作用是用来检测是否符合函数式接口的标准
使用函数式接口
定义完毕了,我们就该使用了
函数式接口的使用一般是在参数中使用的更多一些
所以我在主类里面定义了一个方法
/** 此方法用于展示一个接口参数的传入,并且调用 **/
public static void show(FunctionInterface fun){
fun.method();
}
所以这里就用参数的形式展示
下面展示3中使用函数式接口的方法
1.写一个接口的实现类
/** FunctionInterface的实现类 **/
public class FunctionInterfaceImpl implements FunctionInterface {
@Override
public void method() {
System.out.println("实现类的method方法");
}
}
定义完实现类之后就该使用它了
public static void main(String[] args) {
//1.直接使用实现类
show(new FunctionInterfaceImpl());
}
然后点击运行,运行结果如下
实现类的method方法
2.使用匿名内部类的形式
public static void main(String[] args) {
//2.使用匿名内部类
show(new FunctionInterface() {
@Override
public void method() {
System.out.println("这里使用的是匿名内部类的method方法");
}
});
}
然后点击运行输出
这里使用的是匿名内部类的method方法
3.使用Lambda表达式
public static void main(String[] args) {
//3.使用匿名内部类
show(()->{
System.out.println("这里使用的Lambda表达式");
});
}
然后运行结果如下
这里使用的Lambda表达式
我们还可以对上面的Lambda表达式进行简化
public static void main(String[] args) {
//如果Lambda表达式里面只有一句代码那么可以省略花括号和分号
show(()->System.out.println("这里使用的Lambda表达式"));
}
然后他的运行结果和上面的是一模一样的
带参数和返回值的函数式接口以及Lambda表达式
首先定义一个函数式接口
@FunctionalInterface
interface FunctionInterfaceAdd{
int add(int a,int b);
}
然后在主类写,这里就不当参数了,这里当变量
public static void main(String[] args) {
int n1=3,n2=2;//声明两个变量,当做参数
//这里的a和b是Lambda表达式里面的参数
FunctionInterfaceAdd fa =(a,b)->{return a*b+b;};
//执行方法
int add = fa.add(n1, n2);
//输出add的值
System.out.println("add = " + add);
//输出:add = 8
}
当然这个还是可以简写的
这里只写表达式那一行
//简写前的Lambda表达式
FunctionInterfaceAdd fa =(a,b)->{return a*b+b;};
//简写后的Lambda表达式
FunctionInterfaceAdd fa = (a,b)->a*b+b;
相比之下,去掉了花括号,去掉了return,去掉了分号