Java8Lambda表达式
java8提供的函数一些接口
package java.util.function;
Lambda表达式
- 一种运算符
- 表示匿名函数和闭包
为什么需要用Lambda表达式
- 在Java中,我们无法将函数作为参数传递给一个方法,也无法申明返回一个函数的方法
- 在javaScript中,函数参数是一个函数,返回值是另外一个函数的情况是非常常见的;JavaScript是一门非常典型的函数式语言
Lambda表达是的基本结构
- 用swing定义一个按钮,然后点击按钮触发事件
// java8之前的写法
public static void main(String[] args) {
JFrame jFrame = new JFrame("My JFrame");
JButton jButton = new JButton("My JButton");
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button Pressed!");
}
});
jFrame.add(jButton);
jFrame.pack();
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
以上这种写法在添加事件的用匿名内部类的方式实现
我们目的只是为了打印
System.out.println("Button Pressed!");
实际上我们做了以下的事情
- 申明ActionListener的匿名类
- 然后重写
actionPerformed(ActionEvent e)
方法 - 最后调用到这个方法打印
System.out.println("Button Pressed!");
- Lambda表达式的写法
public static void main(String[] args) {
JFrame jFrame = new JFrame("My JFrame");
JButton jButton = new JButton("My JButton");
jButton.addActionListener(e -> System.out.println("Button Pressed!"));
jFrame.add(jButton);
jFrame.pack();
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Lambda表达式的写法清晰的表达,给Button添加一个事件就是打印System.out.println("Button Pressed!");
- Lambda表达式结构
(param1,param2,param3) -> {
...
}
java8 开始 interface中可以有具体实现的方法
* <p>Note that instances of functional interfaces can be created with
* lambda expressions, method references, or constructor references.
关于函数式接口:
- 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
- 如果我们在某个接口上声明了FunctionalInterface注解,那么编译器就会按照函数式接口的定义来要求该接口
- 如果某个接口只有一个抽象方法,但我们并没有给该接口声明FuncationalInterface注解,那么编译器依旧会将该接口看作是函数式接口.
Lambda表达式的作用
- Lambda表达式为java添加了缺失的函数式编程的特性,是我们能将函数式当作一等公民来实现
- 在函数式作为一等公民的语言中,Lambda表达式的类型是函数,但在java中,Lambda表达式是对象,他们必须依附于一类特别的对象类型-函数式接口(funcational interface)
- 传递行为,而不仅仅是值
- 提升抽象层次
- API重用性更好
- 更加灵活
Lambda
- 语法:(argument) -> {body}
- Eg.
- (arg1,arg2)-> {body}
- (Type1 arg1,Typ2, arg2) -> {body}
- Eg.
- 结构
- 一个Lambda表达式可以有零个或者多个参数
- 参数的类型即可以明确声明也可以根据上下文来推断
- 所有参数需要包含在圆括号内,参数之间用逗号相隔
- 空阔号代表参数集为空
- 当只有一个参数,其类型可以推导时,圆括号可以省略
- Lambda表达式的主题可以包含0条或者多条语句
- 如果Lambda表达式的主题只有一条语句,花括号可以了省略
- 如果Lambda表达式的主题包含一条以上语句,则表达式必须包含在代码块内