JDK8引入了一个新玩意,叫做lamdba(那么大)的表达式,说得神乎其神,说真的,这玩意吧,并不难,但是要讲清楚吧,也不是太容易的事情。
从匿名内部类开始说起
老实交代,直接来讲lamdba表达式还真是个枯燥的玩意,那从哪下手呢,我想你一定使用过匿名内部类吧,这玩意在javaswing里面用的超级多。
比如监听一个按钮的单击事件:
JButton jButton = new JButton();
jButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了");
}
});
这段代码应该不陌生吧,addActionListener的这方法需要一个ActionListener接口类型的参数,我这里传参就是通过匿名内部类的方式。
你可能会说,swing是什么古董,java开发早不玩这玩意了,嗯,我不好反驳(毕竟连eclipse都是swing\awt开发的)。
好吧,我再举另外一个栗子,线程怎么样,线程如果还不懂,我就要……
创建线程有很多种方式,那么我从里面选一直比较简单的
比如:
new Thread(new Runnable() {
public void run() {
System.out.println("这是个线程,我是匿名内部类");
}
}).start();
好吧,你仔细看下上面两个实例代码,并且……
并且数一数上面代码的行数,我姑且算它5行不过分吧。
话锋一转,来看下Lamdba的定义
定义:Lambda是一个匿名函数,即没有函数名的函数(简化了匿名委托的使用,让你让代码更加简洁)
请不要去百度这句话出自哪,我有点羞于承认这是我自己总结的,嗯,有一点成就感,同时也有点害羞。
你来看下这句话的意思,Lambda是一个匿名函数,即没有函数名的函数,这句话是不是非常眼熟,这不就是匿名内部类吗?
嗯,其实括号里面的才是重点【简化了匿名委托的使用,让你让代码更加简洁】
匿名委托又是什么鬼?
其实我卖了个关子,匿名委托就是匿名内部类。
用直白的话来讲,lamdba表达式就是简化了匿名内部类的编写,这样解释应该好懂吧(不懂你把我杀了吧)
万一不懂,嗯,万一还是不懂请留言吧。
Lamdba(那么大)的表达式到底是什么简化代码?
谜题好像要解开了,知道了匿名委托是什么,也知道了Lamdba表达式的定义,那么回到刚才写的那两个匿名内部类。
第一个
JButton jButton = new JButton();
jButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了");
}
});
使用lamdba把上面的简化下:
JButton jButton = new JButton();
jButton.addActionListener(e -> System.out.println("按钮被点击了"));
再来看第二个,线程的那个内部类
new Thread(new Runnable() {
public void run() {
System.out.println("这是个线程,我是匿名内部类");
}
}).start();
再使用lamdba简化一下
new Thread(()-> System.out.println("这是个线程,我是匿名内部类")).start();
好吧,还是那个要求,请你数数,看下使用lamdba表达式到底简化了多少行代码。
嗯,我想现在你一定对lamdba有了一定的理解,知道他确实是简化了代码的编写。
仔细看下这lamdba,感觉还是不太好理解,里面既然冒出了个“->”的符号,现在似乎应该来讲讲lamdba的语法了。。
但,请容我休息一下,具体的lamdba语法留下一次分享。