函数式接口:
Java当中使用Lambda表达式的前提是,必须有“函数式接口”
函数式接口:有且仅有一个抽象方法的接口,叫做函数式接口。
如何才能万无一失地检测一下当前接口是不是函数式接口呢?
用一个固定的格式写在public interface之前一行即可:
- @FunctionalInterface
public interface 函数式接口名{
xxxx…
}
@FunctionalInterface
public interface Calculator {
public abstract int sum(int a,int b);
}
主类:
public class Lambda {
public static void main(String[] args) {
//调用方法时,参数类型是函数式接口,所以Lambda可以推断出来是哪个接口
calc( (int a,int b) -> {return a + b; } ); //30
//除了传参,也可以通过赋值语句左侧的类型来进行Lambda上下文推断
Calculator param = (int a,int b) -> {return a + b; };
calc(param);
// (int a,int b) -> {return a + b; }; //错误写法,没有上下文环境,Lambda无法推断是哪个函数式接口
}
public static void calc(Calculator cal) {
int result = cal.sum(10, 20);
System.out.println(result);
}
}
这里的Lambda表达式:(a,b) -> a + b
calc方法需要一个Calculator接口类型的参数
Lambda表达式就充当了Calculator接口类型的参数
- 1.Lambda表达式前面的小括号,其实就是接口抽象方法的小括号
2.箭头代表拿着小括号的数据做什么事,是一个指向的动作。
3.箭头后面就代表拿到了参数之后做什么事情
4.Lambda表达式的语言本身就代表了怎么做这件事情,没有对象的概念在里面。
Lambda表达式要想使用,一定要有函数式接口的推断环境。
1.要么通过方法的参数类型来确定是哪个函数式接口
2.要么通过赋值操作来确定是哪个函数式接口
Lambda的格式就是为了将抽象方法的头翻译成为以下三点:
1.一些参数(方法参数)
2.一个箭头
3.一些代码(方法体)
-
例如抽象方法:
public abstract int sum(int a,int b); -
翻译成Lambda:
(int a,int b) -> { return a + b;}
Lambda简写:
- 接口
注意,不管写不写@FunctionalInterface,只要是有且仅有一个抽象方法的接口,就是函数式接口
@FunctionalInterface
public interface MyInterface {
//作用,将参数++,然后返回结果
public abstract int singlePlus(int num);
}
- Lambda主类:
public class Calc {
public static void main(String[] args) {
calc((a, b) -> a - b); // -10
calc((a, b) -> a + b); // 30
}
public static void calc(Calculator cal) {
int result = cal.sum(10, 20);
System.out.println(result);
}
}
1.Lambda表达式中的参数类型可以不写
2.参数只有一个,参数小括号可以省略
3.如果语句只有一个,那么大括号和return也可以省略
public class LambdaSimple {
public static void main(String[] args) {
//标准格式:
method( (int x) -> {return ++x;} );
//省略参数格式:
method( (x) -> {return ++x;} );
//省略参数小括号:
method( x -> {return ++x;} );
//省略大括号和return关键字
method( x -> ++x );
}
public static void method(MyInterface inter) {
int result = inter.singlePlus(10);
System.out.println(result);
}
}