对一个经常写JS的人来说,Java用起来很不舒服,因为感觉有很多冗余的代码。
Java多线程代码
即使使用匿名内部类,Java创建线程的代码也会是下面这样:
new Thread(){
@Override
public void run() {
// do some things
}
}.start();
但是使用JDK8的Lambda表达式就会是这样:
new Thread(()->{
// do some things
}).start();
JS箭头函数那味儿出来了。
语法
()->{}
() // 参数列表
-> // 必不可缺,把参数传递给函数体
{} // 函数体
Lambda是可推导可省略的。能够根据上下文推导出的内同,都可以省略书写。
参数列表的数据类型可以不写。括号中的参数如果只有一个,()也可以不写。如果{}中的代码只有一行,无论是否有返回值,都可以省略{}(此时会自动return)。
如果Lambda表达式做的事与其它某个方法相同。可以通过::方法引用符来代替。下面两种方法等价。
s->System.out.println(s);
System.out::println; // 需要上面表达式的地方可以用这局,等效
Lambda使用前提
- 使用Lambda必须具有接口,并且接口中只有一个抽象方法。无论是JDK内置的还是自己定义的接口。
- 虽然省略数据类型,但是必须要保证数据类型是正确的。
最后
使用匿名内部类在编译后会创建一个class文件,意味着要多加载一个类,但是Lambda表达式不会。所以Lambda表达式的性能是比匿名内部类高的。Lambda是延迟加载的,所以可以用在某些地方优化性能。