javaSE复习之——Lambda表达式

函数式编程思想:lamlbda(jdk8新特性)

在数学中,函数是有输入量,输出量的一套计算方案,相对而言面向对象过分强调“必须通过对象的形式来做事情”,而函数式编程则是尽量忽略面向对象的复杂语法–强调做什么,而不是以什么形式做

面向对象思想

找一个对象,调用对象的方法帮我做事,也就是自己找人帮忙做事

函数式编程思想

只要能获取到结果,谁去做都可以,怎么做不重要,只在意结果。

  • 举个很形象的例子:
    我是老板,我就是要完成这个项目的开发,至于谁去做,怎么做,都不关我的事,我只要结果

  • 再举个例子:
    当我们创建线程的时候,用已知的方法,最简便的创建方法就是使用匿名内部类,而我们只要重写的run方法,而不是创建的那个匿名内部类

lambda表达式于匿名内部类区别

  • lambda因为不用创建class字节码文件,所以效率高于匿名内部类

使用匿名内部类创建一个线程

1
2
3
4
5
6
7
new Thread() {
@Override
public void run() {

}
}.start();

使用lambda创建一个线程

1
2
3
4
new Thread(() -> {

}).start();

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表达式中传入的业务逻辑代码就不会被执行,这样就达到了提升性能的目的