我正在阅读关于新功能的文章: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);
}
..。诸若此类?
发布于 2014-02-18 18:37:00
您可以通过使用helper接口将多方法接口与lambdas一起使用。这适用于这样的侦听器接口,其中不需要的方法的实现是微不足道的(即,我们也可以做MouseAdapter
提供的事情):
// note the absence of mouseClicked…
interface ClickedListener extends MouseListener
{
@Override
public default void mouseEntered(MouseEvent e) {}
@Override
public default void mouseExited(MouseEvent e) {}
@Override
public default void mousePressed(MouseEvent e) {}
@Override
public default void mouseReleased(MouseEvent e) {}
}
您只需要定义这样一个帮助器接口一次。
现在,您可以为Component
c
上的点击事件添加一个监听器,如下所示:
c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));
发布于 2014-02-18 00:03:25
来自JLS 9.8
函数接口是只有一个抽象方法的接口,因此表示单个函数契约。
Lambda需要这些函数接口,因此仅限于它们的单个方法。匿名接口仍然需要用于实现多方法接口。
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
...
}
@Override
public void mousePressed(MouseEvent e) {
...
}
});
发布于 2014-04-30 03:48:04
Lambda EG确实考虑了这个问题。许多库使用函数式接口,即使它们是在函数式接口成为事物之前多年设计的。但有时确实会发生这样的情况:一个类有多个抽象方法,而您只想用lambda来针对其中的一个方法。
这里官方推荐的模式是定义工厂方法:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
这些可以由API本身直接完成(这些可以是MouseListener
中的静态方法),也可以是其他库中的外部辅助方法(如果维护者选择不提供这种便利的话)。因为需要这样做的情况集很小,而解决方法又是如此简单,所以似乎没有必要进一步扩展语言来挽救这个角落案例。
ThreadLocal
也采用了类似的技巧;请参阅新的静态工厂方法withInitial(Supplier<S>)
。
(顺便说一句,当这个问题出现时,示例几乎总是MouseListener
,这是令人鼓舞的,因为它表明希望对lambda友好的类集实际上非常小。)
https://stackoverflow.com/questions/21833537
复制相似问题