Lamda表达式只针对有一个抽象方法的接口实现。
Lamda表达式的语法格式:
([数据类型 参数名,数据类型 参数名,....])->{表达式主体}
(1)([数据类型 参数名,数据类型 参数名,....])用来向表达式主体传递接口方法需要的参数,多个参数名用英文逗号分割。在编写Lamda表达式时可以缺省参数的数据类型,表达式主体会自动进行校对和匹配,如果只有一个参数可以省略括号()。
(2)->:表示表达式箭牌不能省略,必须是英文横线和大于号书写
(3){表达式主体}:由单个表达式或语句块组成的主体,本质是接口中抽象方法的具体实现,如果语句中只有一条语句可以省略大括号,Lamda表达式允许有返回值,如果只有一条return语句也可以省略return关键字。
interface Student{
void name();
}
public class Example{
public static void main(String[] args){
studentName(new Student{
public void name(){
System.out.println("ddd")
}
});
studentName(()->System.out.println("Lamda表达式"))
}
public static void studentName(Student stu){
stu.name();
}
}
函数式接口:
函数式接口是指有且仅有一个抽象方法的接口,Lamda表达式就是Java中函数式编程的实现,只有确保接口中只有一个抽象方法,Lamda表达式才能顺利实现接口中的这个方法。Jdk8中引入了@FunctionalInterface注解,该注解只是显示的标注了接口是一个函数式接口,强制编辑器进行更严格的检查,对程序运行没有实质的影响。
@FunctionalInterface
interface Student{
void name();
}
public class Example{
public static void main(String[] args){
studentName(()->System.out.println("Lamda表达式"))
}
public static void studentName(Student stu){
stu.name();
}
}
方法引用与构造器引用
Lamda表达式的主体只有一条语句时,程序不仅可以省略主体的大括号,还可以通过英文双冒号“::”语法格式来引用方法和构造器。
Lamda表达式对普通方法和构造方法的引用形式
种类 | Lamda表达式示例 | 对应的应用示例 |
类名引用普通方法 | (x,y,...)->对象名x.类普通方法名(y,...) | 类名::类普通方法名 |
类名引用静态方法 | (x,y,...)->类名.类静态方法名(x,y,...) | 类名::类静态方法名 |
对象名引用方法 | (x,y,...)->对象名.实例方法名(x,y,...) | 对象名::实例方法名 |
构造器引用 | (x,y,...)->new 类名(x,y,...) | 类名::new |
用法示例:
类名引用普通方法
printUpper("hello",(object,t)->object.printUpperCase(t))
printUpper("hello",StringUtils::printUpperCase)
类名引用静态方法
funcationName(-10,n->Math.abs(n))
funcationName(-10,Math::abs)
对象名引用方法
printUpper("hello",t->stu.printUpperCase(t));
printUpper("hello",stu::printUpperCase);
构造器引用
printName("Tom",name->new Person(name))
printName("Tom",Person::new)