初识Java8 Lambda表达式

说到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来标明这是个函数式接口,可以在编译期发现错误。

猜你喜欢

转载自www.cnblogs.com/chsoul/p/13209513.html