为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

BIG阳 2019-10-29 10:45:17
我在以下位置阅读有关新功能的信息: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);}... 等等?
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

从JLS 9.8起


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


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


addMouseListener(new MouseAdapter() {


    @Override

    public void mouseReleased(MouseEvent e) {

       ...

    }


    @Override

    public void mousePressed(MouseEvent e) {

      ...

    }

});


查看完整回答
反对 回复 2019-10-29
?
HUH函数

TA贡献1836条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-10-29
?
跃然一笑

TA贡献1826条经验 获得超6个赞

Lambda EG确实考虑了这个问题。许多库都使用功能接口,即使它们是在功能接口成为现实之前就设计的。但是有时候确实会发生一个类具有多个抽象方法的情况,而您只想使用lambda来定位其中的一个。


此处官方推荐的模式是定义工厂方法:


static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }

这些可以由API本身直接完成(这些可以是内的静态方法MouseListener),也可以是其他一些库中的外部帮助器方法(如果维护者选择不提供这种便利)。因为需要这种情况的情况很小,而且解决方法非常简单,所以似乎并没有要求进一步扩展语言以挽救这种极端情况。


采用了类似的技巧ThreadLocal; 请参阅新的静态工厂方法withInitial(Supplier<S>)。


(顺便说一句,当出现此问题时,示例几乎总是MouseListener,这是令人鼓舞的,因为它表明希望对lambda友好但对lambda友好的类的集合实际上很小。)


查看完整回答
反对 回复 2019-10-29
  • 3 回答
  • 0 关注
  • 1116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信