说到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 函数式编程》