什么是λ表达式
面向对象过分强调“必须通过对象的形式来做事情”,于是经常看到这样的写法: 如果你想写一个方法,那么就必须把它放到一个类里面,然后new出来对象,对象调用这个方法。 这种方式在函数式编程语言看来太死板。 Lambda表达式即函数式编程, 在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。 函数式编程思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。
Lambda的格式
Lambda表达式的标准格式为 |
---|
(参数列表) -> { 方法体 } |
Lambda表达式的三个组成部分: |
---|
(参数列表) : 方法的参数列表,如果方法没有参数,括号为空() |
-> 固定写法 |
{方法体} 方法体的实现代码 |
好处:不用写匿名内部类,不用重写方法。只有方法体。
Lambda的使用前提
使用Lambda表达式的前提,接口中只能有一个抽象方法。
Lambda省略格式
1) 方法中的参数类型可以省略 2) 如果方法的参数只有一个,小括号也可以省略 3) 如果方法体仅有一条语句,大括号,如果有返回值return可以省略,分号可以括号。
Lambda格式小结:
λ表达式本质上是一个匿名方法。
假如有一个接口中有int add(int m,int n)方法,实现类中的方法如下:
int add(int m, int n) { return m+n; }
转成λ表达式后是完整的写法:
(int m, int n) -> {return m+n;}
参数类型可以省略,Java编译器会根据上下文推断出来,返回值:
(m,n) -> {return m+n;}
因为方法体只有一条语句,可以省略return、大括号和分号
(m,n) -> m+n
如果只有一个参数,则小括号也可以省略,比如方法:
int getNum(int num) { return num + 5; }
Lambda的写法:
num -> num+5
Lambda基本使用
Lambda本质上是一个接口的实现类
无参无返回值
需求说明
1) 给定一个接口,内含唯一的方法,且无参数、无返回值。
2) 在main函数中,直接实例化接口,使用匿名内部类,实现方法
3) 使用Lambda的实例化对象,调用方法
案例代码:
//1)给定一个Print接口,内含唯一的方法print(),且无参数、无返回值。 interface Print{ void print(); } public static void main(String[] args) { //2) 在main函数中,直接实例化Print接口,使用匿名内部类,实现print()方法,输出:Hello world ! Print p1 = new Print() { public void print() { System.out.println("Hello world !"); } }; //调用接口中的方法 p1.print(); //3) 使用Lambda的实例化Print对象,调用print()方法,输出:Hello world ! Print p2 = () -> System.out.println("Hello world !"); p2.print(); }
有参有返回值
案例需求
1) 给定一个计算器Calculator接口,内含抽象方法int cal(int a, int b) 将两个int数字相加得到和并且返回。
2) 创建类和main函数
3) 使用匿名内部类实例化对象c1,并且调用cal()方法输出结果。
4) 使用Lambda实例化对象c2,并且调用cal()方法输出结果。
案例代码
//1) 给定一个计算器Calculator接口 interface Calculator { //内含抽象方法int cal(int a, int b) 将两个int数字相加得到和并且返回。 int calc(int a, int b); } public class Demo { // 2) 创建类和main函数 public static void main(String[] args) { // 3) 使用匿名内部类实例化对象c1,并且调用cal()方法输出结果。 Calculator c1 = new Calculator() { public int cal(int a, int b) { return a + b; } }; //调用接口中的方法 System.out.println(c1.cal(3, 5)); // 4) 使用Lambda实例化对象c2,并且调用cal()方法输出结果。 Calculator c2 = (a, b) -> a + b; System.out.println(c2.cal(3, 5)); } }
基本使用小结
Lambda其实是对一段方法中的行为进行传递,即将方法体做为参数传递。 它对匿名内部类的编写方式进行了优化,以前使用匿名内部类写的代码既难看,又冗长。 Lambda让这种代码变得更加简洁。