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

Lambda表达式的多种写法:

Runnable noArguments = () -> System.out.println("Hello World"); 
ActionListener oneArgument = event -> System.out.println("button clicked");
        
Runnable multiStatement = () -> {
     System.out.print("Hello");
     System.out.println(" World");
};
        
BinaryOperator<Long> add = (x, y) -> x + y; 
        
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;

Lambda的本身是函数接口,特点是只有一个方法的接口,而且会被反复使用,类似于swing中的接口,其引用的是值,而不是变量。

上面的描述可能还是比较难懂,再举一个简单的例子

public static void main(String[] args) {
        // 匿名内部类
        Comparator<Integer> compare1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer x, Integer y) {
                return Integer.compare(x, y);
            }
        };
        // Lambda 表达式
        Comparator<Integer> compare2 = (x, y) -> Integer.compare(x, y);
        
        System.out.println(compare1.compare(1,0));
        System.out.println(compare2.compare(1,0));     
}

执行结果:

1
1

我的理解简单来说就是:

Lambda表达式可以将一段代码的执行结果作为一个值来传递,相当于传递一段代码块

相比于传统语法模式提高开发效率,使得代码编写简洁,更为简单易懂。
参考资料:《Java8 函数式编程》

posted @ 2020-06-29 18:39  星光Starsray  阅读(131)  评论(0编辑  收藏  举报