一、函数式接口
只有一个抽象方法的接口,该方法代表了该接口的功能。 如常见的Runnable和Comparator。有时候被称为SAM类型(Single Abstract Method,单抽象方法)。
Object类的方法被称为函数式接口的隐式成员。
二、lambda表达式
1、JDK 8新增特性之一
2、用于增强对多核环境的并行编程能力,以及支持对数据执行管道操作的新流API。
3、lambda表达式本质上是一个匿名方法,这个方法实现了
函数式接口定义的方法。也就是说,lambda表达式会产生一个匿名类,它是函数式接口的实现类。因此lambda表达式也常被称为“闭包”。
4、
lambda操作符:-> ,其左侧指定lambda表达式需要的所有参数(无参数则使用空的参数列表),右侧指定lambda体。
5、Java定义了两种lambda体,一种包含一个单独的表达式,一种包含一个代码块。
6、当接口引用上下文中出现lambda表达式时,会自动创建函数式接口的一个实现类,接口抽象方法的具体实现由lambda表达式定义。当通过接口引用调用该方法时,就会执行lambda表达式。lambda表达式提供了一种将代码片段转换为对象的方法。
7、lambda表达式的参数的类型和数量必须与函数式接口定义的方法的参数兼容;返回类型也必须兼容;并且lambda表达式可能跑出的异常必须能被方法接受。
8、函数式接口引用可以用来执行任何与其兼容的lambda表达式。
三、lambda表达式示例
示例一:
1、函数式接口(无参数)
interface MyNumber {
double getValue(); //方法无参数,返回类型是double
}
2、lambda表达式
() -> 123.45
它实际上是getValue()方法的的具体实现,等效于:
double getValue(){
return 123.45;
}
3、调用lambda表达式
public static void main(String[] args) {
MyNumber myNum = () -> 123.45; //myNum是函数式接口的引用
myNum.getValue(); //通过函数式接口引用来调用执行方法
myNum = () -> 3.14; //函数式接口引用可以执行多个兼容的lambda表达式
myNum.getValue();
}
示例二:
1、函数式接口(有一个参数)
interface Numeric {
boolean judge(int n);
}
2、使用lambda表达式
Numeric num =
(n) -> n % 2 == 0; //参数 n,方法体是 return n%2==0;
num.judge(5);
只有一个参数时,可以省略括号。多个参数时,必须加括号。
Numeric num =
n -> n % 2 == 0;
num.judge(5);
注意:这里的lambda表达式没有指定参数 n 的类型,n的类型是从上下文推断出来的。
当然,
在lambda表达式中可以显示的指定参数的类型。
Numeric num =
(int n) -> n % 2 == 0;
num.judge(5);
示例三:
1、函数式接口(有多个参数)
interface Numeric2 {
boolean judge(int m, int n);
}
2、lambda表达式
Numeric2 num2 =
(m, n) -> (m % n) == 0;
num2.judge(10, 5);
注意:显示指定参数类型时,必须每个参数都指定类型。
Numeric2 num2 =
(int m, int n) -> (m % n) == 0; //正确
Numeric2 num2 =
(int m, n) -> (m % n) == 0; //错误
四、块lambda表达式
1、lambda操作符右侧的代码可以由一个代码块组成,代码块中可以包含多条语句,如声明变量、if语句、循环语句、lambda表达式语句、return语句等等。
2、创建,只需要一对花括号即可,
(...)->{... };
示例一:
1、函数式接口
interface Func{
int func(int n); //阶乘
}
2、lambda块
Func fc = n ->
{
int res = 1;
for(int i = 1; i <= n; i++){
res *= i;
}
return res;
};
fc.func(5); //调用
示例2:
1、函数式接口
interface StrRev{
String reverse(String str); //字符串反转
}
2、lambda块
StrRev sr = str -> {
String s = "";
for(int i=str.length()-1;i>=0;i--){
s += str.charAt(i);
}
return s;
};
sr.reverse("abcd");
因为,根据上下文可以推断出str是String类型,所以lambda表达式内部可以调用String类型的方法。
211

被折叠的 条评论
为什么被折叠?



