Men*_*los 79 java lambda anonymous-class java-8
我正在阅读以下新功能: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);
}
... 等等?
Rei*_*eus 87
来自JLS 9.8
功能接口是只有一个抽象方法的接口,因此代表单个函数契约.
Lambdas需要这些功能接口,因此仅限于其单一方法.匿名接口仍然需要用于实现多方法接口.
addMouseListener(new MouseAdapter() {
    @Override
    public void mouseReleased(MouseEvent e) {
       ...
    }
    @Override
    public void mousePressed(MouseEvent e) {
      ...
    }
});
Hol*_*ger 76
您可以使用辅助接口将多方法接口与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 !"));
Bri*_*etz 31
Lambda EG确实考虑过这个问题.许多库使用功能接口,即使它们是在功能接口成为事物之前的几年设计的.但有时会发生一个类有多个抽象方法,而你只想用lambda来定位其中一个.
这里官方推荐的模式是定义工厂方法:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
这些可以直接由API本身完成(这些可以是其中的静态方法MouseListener),或者如果维护者选择不提供这种便利,则可以是其他库中的外部辅助方法.因为需要这种情况的情况很少,并且解决方法非常简单,所以扩展语言以挽救这个角落的情况似乎并不引人注目.  
采用了类似的技巧ThreadLocal; 看到新的静态工厂方法withInitial(Supplier<S>).  
(顺便说一下,当这个问题出现时,这个例子几乎总是如此MouseListener,这是令人鼓舞的,因为它表明那些希望对lambda友好的类,但实际上并不是很小.)
| 归档时间: | 
 | 
| 查看次数: | 50440 次 | 
| 最近记录: |