一尘不染

Java 8 Lambda表达式-嵌套类中的多个方法呢?

java

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

… 等等?


阅读 891

收藏
2020-03-22

共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) {}
}

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

现在,你可以Component c像这样添加点击事件的侦听器:

c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));
2020-03-22
一尘不染

从JLS 9.8起

功能接口是仅具有一种抽象方法的接口,因此表示单个功能协定。

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

addMouseListener(new MouseAdapter() {

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

    @Override
    public void mousePressed(MouseEvent e) {
      ...
    }
});
2020-03-22