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

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

}

... 等等?


BIG阳
浏览 1117回答 3
3回答

智慧大石

从JLS 9.8起功能接口是仅具有一种抽象方法的接口,因此表示单个功能协定。Lambda需要这些功能接口,因此仅限于它们的单一方法。仍然需要使用匿名接口来实现多方法接口。addMouseListener(new MouseAdapter() {    @Override    public void mouseReleased(MouseEvent e) {       ...    }    @Override    public void mousePressed(MouseEvent e) {      ...    }});

HUH函数

您可以通过使用辅助程序接口将多方法接口与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 !"));

跃然一笑

Lambda EG确实考虑了这个问题。许多库都使用功能接口,即使它们是在功能接口成为现实之前就设计的。但是有时候确实会发生一个类具有多个抽象方法的情况,而您只想使用lambda来定位其中的一个。此处官方推荐的模式是定义工厂方法:static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }这些可以由API本身直接完成(这些可以是内的静态方法MouseListener),也可以是其他一些库中的外部帮助器方法(如果维护者选择不提供这种便利)。因为需要这种情况的情况很小,而且解决方法非常简单,所以似乎并没有要求进一步扩展语言以挽救这种极端情况。采用了类似的技巧ThreadLocal; 请参阅新的静态工厂方法withInitial(Supplier<S>)。(顺便说一句,当出现此问题时,示例几乎总是MouseListener,这是令人鼓舞的,因为它表明希望对lambda友好但对lambda友好的类的集合实际上很小。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java