javaSE复习之——Lambda表达式
函数式编程思想:lamlbda(jdk8新特性)
在数学中,函数是有输入量,输出量的一套计算方案,相对而言面向对象过分强调“必须通过对象的形式来做事情”,而函数式编程则是尽量忽略面向对象的复杂语法–强调做什么,而不是以什么形式做
面向对象思想
找一个对象,调用对象的方法帮我做事,也就是自己找人帮忙做事
函数式编程思想
只要能获取到结果,谁去做都可以,怎么做不重要,只在意结果。
举个很形象的例子:
我是老板,我就是要完成这个项目的开发,至于谁去做,怎么做,都不关我的事,我只要结果再举个例子:
当我们创建线程的时候,用已知的方法,最简便的创建方法就是使用匿名内部类,而我们只要重写的run方法,而不是创建的那个匿名内部类
lambda表达式于匿名内部类区别
- lambda因为不用创建class字节码文件,所以效率高于匿名内部类
使用匿名内部类创建一个线程
1 | new Thread() { |
使用lambda创建一个线程
1 | new Thread(() -> { |
ps:可以看出,使用lambda代码更加的简洁
lambda详解:
- ():即run方法的参数,可以传也可以不传
- ->:代表前面的参数传递给后面的方法体,传递的意思
- {}:里面放重写的run方法中的业务逻辑代码
标准格式:
(参数列表) -> {重写的方法中的代码}
ps:lambda也可以有返回值
Lambda使用时的注意事项
1、使用Lambda必须要有接口,并且接口中有且只有一个抽象方法
2、使用Lambda必须有上下文推断,也就是方法的参数或者局部变量类型必须为Lambda对应接口的类型
- ps:
仅有一个抽象方法的接口,称为“函数式接口”
lambda的省略方式
1、参数列表中的参数可以省略参数类型
2、代码块的{}可以省略,但只限于只有一条语句
3、return可以省略,直接一条语句返回一个值即可
4、分号可以省略
5、参数列表中只有一个参数可以省略括号
ps:条需要省略一个就一定要全部都省略
lambda的延迟执行
有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费。而lambda是延迟执行的,所以正好可以作为解决方案,用于提升性能
如何延迟执行?
- 答:
使用lambda表达式时,必须有一个函数式接口(只有一个抽象方法的接口),我们使用lambda表达式时,只要不调用这个接口中的抽象方法,那么lambda表达式中的业务逻辑代码就不会执行
举个例子
不使用lambda:
一个方法中传入一个拼接的字符串,无论这个方法适不适用这个字符串,它都会有拼接的过程,如果判断条件不符合,不使用这个字符串的话,那么就造成了资源浪费
使用lambda:
让那个方法传的参数是一个函数式接口,我们在调用这个方法的时候,使用lambda表达式进行传参,这样在方法中只要因为某些原因不调用这个接口的方法,那么lambda表达式中传入的业务逻辑代码就不会被执行,这样就达到了提升性能的目的