lambda表达式本质上就是一个匿名方法,但这个方法不是独立执行的,而是用于实现由函数式接口定义的另一个方法。因此,lambda表达式会导致产生一个匿名类,lambda表达式也常被称为闭包。
函数式接口:指仅包含一个抽象方法的接口,有时也被称为SAM类型,意思是单抽象方法(Single Abstract Method)
- 简单lambda表达式
//无参数
interface A(){
int getValue();
}
//含参数
interface B(){
int getValue(String aNumber);
}
class Test(){
public static void main(String[] args){
A a;
a = ()->1;
System.out.println(a.getValue());//结果为1
B b;
b = (n)->Integer.valueOf(n);
System.out.println(b.getValue("5"));//结果为5
}
}
- 块lambda
块lambda可以执行多行代码,和简单lambda有所不同,需要自行return一个结果
interface A(){
int factorial(Integer n);//阶乘
}
class Test(){
public static void main(String[] args){
A a = (n)->{
int result = 1;
for(int i = 1; i <= n; i++){
result = i*result;
}
return result;
};
System.out.println(a.factorial(2));//结果为2
System.out.println(a.factorial(3));//结果为6
}
}
- 将lambda表达式作为参数传递
interface A(){
int factorial(int i);//阶乘
}
class Test(){
static int test(A a,int i){
return a.factorial(i)
}
public static void main(String[] args){
int factorial= Test.test((n)->{
int result = 1;
for(int i = 1; i <= n; i++){
result = i*result;
}
return result;
},2);
System.out.println(factorial);//结果为2
}
}
- lambda表达式方法引用
相当于直接引用一个方法实现
interface A(){
int getValue();
}
class Test(){
static int test1(int i){
return ++i;
}
int test2(int i){
return ++i;
}
public static void main(String[] args){
//静态方法的方法引用
A a = Test::test1;
System.out.println(a.getVaule(1));//结果为2
//实例方法的方法引用
Test t = new Test();
A a2 = t::test2;
System.out.println(a2.getVaule(1));//结果为2
}
}
简单介绍了一下lambda表达式,其实lambda表达式并不难理解,之后会整理一些lambda表达式在流中的应用场景