说到Java8新特性,就算没使用过的人估计也会说函数式编程,Lambda表达式,到底该怎么使用呢,第一次学习,做个简单笔记记录一下。
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包
什么是函数式编程?
使用不可变值和函数,函数对一个值进行处理,映射成另一个值;函数式编程关心数据的映射,命令式编程关心解决问题的步骤。
我这里就简单说,具体思想推荐一篇知乎文章:https://www.zhihu.com/question/28292740?sort=created
说到swing,熟悉Java的估计知道这是一个编写GUI的Java图形类库,里面很多基于匿名内部类,事件驱动的代码,很适合演示代码使用λ表达式后由繁到简的过程。
新建一个窗体,添加一个按钮事件:
class TestLambda {
public static void testSwing() {
JFrame jFrame = new JFrame("标题");
Container container = jFrame.getContentPane();
JButton button = new JButton("按钮");
//不使用lambda表达式
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
});
//使用lambda表达式
button.addActionListener((event)->{ System.out.println(event.getActionCommand()); });
container.add(button);
jFrame.setBounds(200,200,200,200);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
testSwing();
}
}
是不是感受到了代码简化了很多,但是需要主义的是并不是所有接口都可以使用lambda表达式,只有函数式接口才可以使用lambda表达式。
- 什么是函数式接口?
- 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
- 函数式接口可以被隐式转换为 lambda 表达式,可以添加@FunctionalInterface来标明这是个函数式接口,可以在编译期发现错误。