什么是语法糖:
语法糖指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。不过其并没有给语言添加什么新东西。
Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。就是使用Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读。lambda表达式就是一个典型的语法糖.实际会被翻译为对象式代码.
用简单易懂的话说,lambda表达式就是将那些代码中一定的,必要的,不可变的一部分给省略掉了,省略掉的部分JVM根据上下文推断出来,简单示例如下:
//没有用lambda表达式时
public class LambdaDemo1 {
public void oldCode() {
new Thread() {
public void run() {
System.out.println("hello lambda!");
}
}.start();
}
}
//使用lambda表达式后
public class LambdaDemo1 {
public void oldCode() {
new Thread(()->System.out.println("hello lambda!")).start();
}
}
使用lambda表达式省略的部分
可以看出,lambda表达式让代码更简略清晰,模拟了函数式编程的外观,但是翻译后底层还是会和原来一样.这也就是语法糖的作用了.
lambda的历史: λ (波长单位), 这里指带有参数变量的表达式称为lambda表达式.
lambda表达式的基本语法 :
参数列表 -> 表达式
参数列表:
- 如果没有参数;直接用()来表示;()不能省略.
- 如果只有一个参数,并且参数写了类型,参数外面一定要加().
- 如果只有一个参数,并且参数不写类型,那么这个参数外面可以不用加().
- 如果有两个或多个参数,不管是否写参数类型,都要加().
- 如果参数要加修饰符或者标签,参数一定要加上完整的类型.所以此时也要用().
表达式:
- 如果表达式只有一行,那么可以直接写(不需要用{}).
- 如果只有单行的情况,并且方法需要返回值,此时不能有return,JVM会自动帮我们推导return.
- 如果表达式有多行,需要用{}变成代码块.
- 如果表达式是代码块,并且方法需要返回值,那么,在代码块中就必须返回一个返回值.
lambda中的变量:
- 参数
- 局部变量.
- 自由变量(即除了它自己的参数和内部定义的局部变量).
1)自由变量在lambda表达式中不能修改;
2)参数和局部变量的使用方法和普通的变量使用方法相同;
3)lambda表达式中的this指向"创建lambda表达式的方法中的this"
在Java8以前,如果要在内部类访问外部对象的一个本地变量,那么这个变量必须声明为final才行。在Java8中,这种限制被去掉了,代之以一个新的概念,“effectively final”。它的意思是你可以声明为final,也可以不声明final但是按照final来用,也就是一次赋值永不改变。换句话说,保证它加上final前缀后不会出编译错误。 在Java8中,内部类和λ表达式都可以访问effectively final的本地变量。
闭包:
操作自由变量的代码块,称之为闭包,在java中,lambda表达式就是闭包,事实上,内部类一直都是闭包.
网友评论