Java 8 Lambda 表达式 - 嵌套类中的多个方法怎么样

2022-08-31 11:00:44

我正在阅读有关新功能的信息: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);
}

...等等?


答案 1

来自 JLS 9.8

函数接口是只有一个抽象方法的接口,因此表示单个函数协定。

Lambda 需要这些功能接口,因此仅限于其单一方法。匿名接口仍然需要用于实现多方法接口。

addMouseListener(new MouseAdapter() {

    @Override
    public void mouseReleased(MouseEvent e) {
       ...
    }

    @Override
    public void mousePressed(MouseEvent e) {
      ...
    }
});

答案 2

您可以通过使用帮助程序接口将多方法接口与 lambda 结合使用。这适用于这样的侦听器接口,其中不需要的方法的实现是微不足道的(即我们也可以只做提供的功能):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) {}
}

您只需定义一次这样的帮助程序接口。

现在,您可以为单击事件添加一个侦听器,如下所示:Componentc

c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));

推荐