Lambda表达式
一、Lambda表达式简介
什么是Lambda
Lambda 表达式,也可称为闭包,它是 Java 8 发布的新特性,实际是一个匿名方法
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)
为什么使用Lambda
使用Lambda表达式可以对一个接口进行非常简洁的实现
Lambda对接口的要求
并不是所有接口都可以用Lambda表达式实现,要求接口中定义的抽象方法只能有一个
@FunctionalInterface(函数式接口):接口中的抽象方法只有一个
二、Lambda的基础语法
一般方法构成
返回值类型 方法名 参数列表 方法体
Lambda表达式是一个匿名方法,不用加返回值类型
参数列表 方法体
() -> {}
() 用来描述参数列表
{} 用来描述方法体
-> Lambda运算符,读作goes to
//接口
//无参,无返回值
Public interface Interface1{
void test();
}
//无返回值,单个参数
Public interface Interface2{
void test(int n);
}
//无返回值,多个参数
Public interface Interface3{
void test(int a,int b);
}
//有返回值,无参
Public interface Interface4{
int test();
}
//有返回值,单个参数
Public interface Interface5{
int test(int n);
}
//有返回值,多个参数
Public interface Interface6{
int test(int a,int b);
}
//无参,无返回值
Interface1 lambda1 = ()->{
System.out.println("hello,world");
};
lambda1.test();
//hello,world
//无返回值,单个参数
Interface2 lambda2 = (int a)->{
System.out.println("a");
};
lambda2.test(10);
//10
//无返回值,多个参数
Inerface3 lambda3 = (int a,int b)->{
System.out.println(a+b);
};
lambda3(10,9);
//19
//有返回值,无参
Interface4 lambda4 = ()->{
System.out.println("调用lambda4");
return 10;
};
int ret = lambda4.test();
System.out.println(ret);
//调用lambda4
//10
//有返回值,单个参数
Interface5 lambda5 = (int a)->{
return a*2;
};
int ret = lambda5.test(10);
System.out.println(ret);
//20
//有返回值,多个参数
Interface6 lambda6 = (int a,int b)->{
return a+b;
};
int ret = lambda6.test(10,20);
System.out.println(ret);
//30
三、Lambda语法精简
1.参数
由于在接口的抽象方法中已经定义了参数类型,所以在Lambda表达式中,参数的类型可以省略
如果需要省略类型,则每一个参数类型都要省略
//无返回值,单个参数
Interface2 lambda2 = (a)->{
System.out.println("a");
};
lambda2.test(10);
//10
//无返回值,多个参数
Inerface3 lambda3 = (a,b)->{
System.out.println(a+b);
};
lambda3(10,9);
//19
2.参数小括号
如果参数列表中参数数量只有一个,则参数的小括号可以省略
//无返回值,单个参数
Interface2 lambda2 = a->{
System.out.println("a");
};
lambda2.test(10);
//10
3.方法大括号
如果方法体中只有一条语句,那么此时大括号可以省略
//无参,无返回值
Interface1 lambda1 = () -> System.out.println("hello,world");
lambda1.test();
//hello,world
4.return
如果方法体中唯一的一条语句是一个返回值,则在省略大括号的同时,必须省略return
//有返回值,单个参数
Interface5 lambda5 = a -> a*2;
int ret = lambda5.test(10);
System.out.println(ret);
//20
四、Lambda方法引用
方法引用
可以将Lambda表达式的实现指向一个已经实现的方法
语法
方法的隶属者::方法名
隶属者
静态方法 | 类 |
---|---|
非静态方法 | 对象 |
注意
- 参数的数量和类型一定要和接口中定义的方法一致
- 返回值的类型也一定要和接口中定义的方法一致
构造方法的引用
语法
类 :: new
//Person类
public class Person{
public String name;
public int age;
public person(){
System.out.println("调用了Person类的无参构造方法");
}
pubilc person(String name,int age){
this.name = name;
this.age = age;
System.out.println("调用了Person类的有参构造方法");
}
}
//CreatePerson1接口
public interface CreatePerson1{
person getPerson();
}
//CreatePerson2接口
public interface CreatePerson2{
person getPerson(String name,int age);
}
// 构造方法的引用
public static void main(String[] args){
CreatePerson1 lambda1 = ()::new;
Person a = lambda1.getPerson;
//调用了Person类的无参构造方法
CreatePerson2 lambda2 = ()::new;
Person b = lambda2.getPerson("Alice",18);
//调用了Person类的有参构造方法
}