一、lambda表达式
1、lambda表达式 "对匿名内部类进行了优化"
2、概述:
面向对象
1、方法要参数类型为接口类型,采用匿名内部类方式实现接口方法
2、实现核心业务逻辑
lambda
1、套用表达式:(形式参数)->{代码块}
3、区别
'面向对象思想'
goSwimming(new Swimming(){
@overwrite
public void swim(){
sout("swimming!")
}
}
)
public static void goSwimming(Swimming swimming){
swimming.swim();
}
‘lambda表示式‘
goSwimming(()->{
sout("swimming!")
})
public static void goSwimming(Swimming swimming){
swimming.swim();
}
总结:
面向对象思想,更多关注怎么做(谁来做(那个对象)去做)
Lambda表达式,更多关注做什么(函数式编程思想)
函数式编程思想;
1、在数学中,函数时有输入量、输出出量的一套计算方案,也就是“拿数据做出操作”
2、面向对象思想强调“必须通过对象的形式来做事情”
3、函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”
4、格式
形式参数、箭头、代码块
(形式参数)->{代码块}
形式参数:如果有多个参数,参数用逗号隔开;如果没有参数,就为空
->:由英文中的化纤和大于符号组成,固定写法。代表指向动作(传递形式参数)
代码块:具体业务逻辑,方法体内容
5、**大前提**
1、有一个接口
2、接口中有且只有一个抽象方法
6、类型
1、无参数无返回值类型
2、有参数无返回值类型
3、无参数有返回值类型 **返回值类型对应代码块的 return语句**
3、有参数有返回值类型
7、lambda表达式的省略模式
1、参数类型可以省略,但是有多个参数的情况下,不能只省略一个参数类型
2、如果参数有且仅有一个,那么小括号可以省略(没有参数的时候,也不能省略)
3、如果代码块的语句只有一条,可以省略大括号和分号,甚至是return
二、Lambda于匿名内部类的区别
所需类型不同
1、匿名内部类:可以是接口,也可以是抽象类,还可以是具体的实现类
2、lambda:只能是接口
使用限制不同
1、如果接口中有且仅有一个抽象方法,可以使用lambda方法,也可以使用匿名内部类
2、如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用lambda表达式
实现原理不同
1、匿名内部类:编译之后,产生一个单独的.class字节码文件
2、Lambda表达式:编译之后,没有一个单独的.cclass字节码文件。对应的字节码文件会在运行的时候动态生成。