小贴士:
Lambda表达式,简单易懂,可遇不可求,看懂会用即可,不要刻意而为之。在实际的应用开发中,一般遇到@FunctionalInterface注解的接口才使用Lambda表达式。
Lambda表达式是JDK 8开始后的一种新语法形式。
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式
首先必须是接口、其次接口中有且仅有一个抽象方法的形式
通常我们见到的函数式接口上都有一个@FunctionalInterface注解,标记该接口必须是满足函数式接口。
进一步在Lambda表达式的基础上继续化简
- 参数类型可以省略不写。
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
通过创建一个窗口添加按钮的案例,进行理解Lambda表达式是如何一步步化简的。
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Butten {
public static void main(String[] args) {
JFrame win = new JFrame("登录页面");
JButton button = new JButton("按钮");
//为按钮设置监听
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("点击了一下");
}
});
//为窗口添加按钮
win.add(button);
//设置窗口的大小
win.setSize(400,300);
//显示组件
win.setVisible(true);
}
}
点击了一下
点击了一下
查看addActionListener方法源码,发现其参数是一个ActionListener接口,查看ActionListener接口源码,可知,它虽然没有@FunctionalInterface注解标记,但是它有且仅有一个抽象方法,满足Lambda表达式的使用条件
public void addActionListener(ActionListener l) {
listenerList.add(ActionListener.class, l);
}
public interface ActionListener extends EventListener {
/**
* Invoked when an action occurs.
*/
public void actionPerformed(ActionEvent e);
}
//为按钮设置监听
button.addActionListener((ActionEvent e) ->{
System.out.println("点击了一下");
});
- 参数类型可以省略不写。
button.addActionListener((e) -> {
System.out.println("点击了一下");
});
- 如果只有一个参数,参数类型可以省略,同时()也可以省略。
button.addActionListener(e -> {
System.out.println("点击了一下");
});
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
button.addActionListener(e -> System.out.println("点击了一下"));
- 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
//对数组进行其他顺序进行排序
Integer[] a1 = {36,12,24,48,16};
Arrays.sort(a1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// return o1 - o2; //升序
return o2 - o1; //降序
}
});
@FunctionalInterface
public interface Comparator<T>
Arrays.sort(a1,( o1, o2)-> o2 - o1);