先看一个例子
EventQueue.invokeLater(() -> {
JFrame frame = new ImageViewerFrame();
frame.setTitle("ImageViewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
// 上面那一段可以看成如下:
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new ImageViewerFrame();
frame.setTitle("ImageViewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
openItem.addActionListener(Event -> {
int result = chooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION){
String name = chooser.getSelectedFile().getPath();
label.setIcon(new ImageIcon(name));
}
});
// 我们可以将lambda表达式转成匿名内部类的样子
openItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int result = chooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION){
String name = chooser.getSelectedFile().getPath();
label.setIcon(new ImageIcon(name));
}
}
});
再看一个例子
在《JAVA核心编程》中,有一段这样的代码
import javax.swing.*;
import java.awt.*;
import java.io.File;
public class ImageViewer {
public static void main(String[] args){
EventQueue.invokeLater(() -> {
JFrame frame = new ImageViewerFrame();
frame.setTitle("ImageViewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
class ImageViewerFrame extends JFrame{
private JLabel label;
private JFileChooser chooser;
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 400;
public ImageViewerFrame(){
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
label = new JLabel();
add(label);
chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu menu = new JMenu();
menuBar.add(menu);
JMenuItem openItem = new JMenuItem("open");
menu.add(openItem);
openItem.addActionListener(Event -> {
int result = chooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION){
String name = chooser.getSelectedFile().getPath();
label.setIcon(new ImageIcon(name));
}
});
JMenuItem exitItem = new JMenuItem("exit");
menu.add(exitItem);
exitItem.addActionListener(Event -> System.exit(0));
}
}
可以看到两处这样的代码
() -> {
JFrame frame = new ImageViewerFrame();
frame.setTitle("ImageViewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
Event -> {
int result = chooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION){
String name = chooser.getSelectedFile().getPath();
label.setIcon(new ImageIcon(name));
}
Java8的lambda表达式。就是匿名函数。
上面那一段可以看成如下:
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame frame = new ImageViewerFrame();
frame.setTitle("ImageViewer");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
下面一段可以看成:
openItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int result = chooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION){
String name = chooser.getSelectedFile().getPath();
label.setIcon(new ImageIcon(name));
}
}
});
只不过java自动帮你翻译了一下
Java8 特性:
-
在接口中新增了default方法和static方法,这两种方法可以有方法体 (*default方法可以被子接口继承亦可被其实现类所调用,default方法被继承时,可以被子接口覆写;接口中的static方法不能被继承,也不能被实现类调用,只能被自身调用)
-
Lambda表达式(可以看成是匿名内部类,->表示连接符;{}内部是方法体;<实例>::<实例方法名>返回函数式接口,例如Collections::sort)
-
函数式接口(如果一个接口只有一个抽象方法)可以使用Lambda表达式,lambda表达式会被匹配到这个抽象方法上
-
Lambda作用域(可以直接访问标记了final的外层局部变量,实例的字段以及静态变量,lambda内部对于实例的字段以及静态变量是即可读又可写)
-
访问接口的方法:Predicate接口(有一个参数并且返回一个结果,并附带了一些可以和其他函数组合的默认方法);Comparator 在Java 8在此之上添加了多种默认方法
-
Optional 接口(防止NullPointerException异常的辅助类型)
-
Date api(Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数;LocalTime 本地时间类LocalDate 本地日期类 )
-
Annotation 注解,8中支持多重注解了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/132215.html