【发布时间】:2014-03-17 00:17:27
【问题描述】:
我正在阅读有关新功能的信息:http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html
我看到了下面的例子:
使用匿名类:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Action Detected");
}
});
使用 Lambda:
button.addActionListener(e -> {
System.out.println("Action Detected");
});
如果有人想在匿名类中实现多个方法,他们会用MouseListener 做什么,例如:
public void mousePressed(MouseEvent e) {
saySomething("Mouse pressed; # of clicks: "
+ e.getClickCount(), e);
}
public void mouseReleased(MouseEvent e) {
saySomething("Mouse released; # of clicks: "
+ e.getClickCount(), e);
}
...等等?
【问题讨论】:
-
那么你只能使用匿名类。 lambda 的引入并没有使它们被弃用。 Lambda 只能与函数式接口一起使用。
-
将 lambdas 用作 ActionListener 方法很奇怪。你怎么知道,你正在实现接口
ActionListener的方法actionPerformed?! -
@bobbel 这就是功能接口的全部概念,我建议您在评论它们之前阅读它们。
-
@maythesource.com 您可以创建两个额外的接口,例如
MousePressedListener和MouseReleasedListener以及两个方法addMousePressedListener(Button, MousePressedListener)和addMouseReleasedListener(Button, MouseReleasedListener)。然后您可以使用 lambdas 来实现这些事件处理程序。 -
@maythesource.com 甚至更好:你只需要实现
addMousePressedListener(Button, Consumer<MouseEvent>)和addMouseReleasedListener(Button, Consumer<MouseEvent>)这两个方法,而不必提供不必要的接口。
标签: java lambda java-8 anonymous-class