JDK8 使用一行 Lambda 表达式可以代替先前用匿名类五六行代码所做的事情,那么它是怎么实现的呢?从所周知,匿名类会在编译的时候生成与宿主类带上 $1, $2 的类文件,如写在 TestLambda 中的匿名类产生成类文件是 TestLambda$1.class, TestLambda$2.class 等。
我试验了一下,如果使用的是 Lambda 表达式并不会生成额外的类文件,那么字节码里是什么样子的?来看下用 javap -c 反编译出下面文件产生的 TestLambda.class,两个方法,一个是 byAnonymousClass() 使用匿名类,另一个是 byLambda 使用 Lambda 的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package cc.unmi.testjdk8; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; public class TestLambda{ private JButton button = new JButton(); public void byLambda() { button.addActionListener((ActionEvent e) -> System.out.println("Lambda")); } public void byAnonymousClass(){ button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("Anonymous class"); } }); } } |