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

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

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

桃花长相依 2019-12-13 11:10:57
我在以下位置阅读有关新功能的信息: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贡献1824条经验 获得超5个赞

您可以通过使用辅助程序接口将多方法接口与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-12-14
?
达令说

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

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


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


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

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


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


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



查看完整回答
反对 回复 2019-12-14
  • 3 回答
  • 0 关注
  • 243 浏览

添加回答

举报

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