首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 8 Lambda表达式-如何处理嵌套类中的多个方法

Java 8 Lambda表达式-如何处理嵌套类中的多个方法
EN

Stack Overflow用户
提问于 2014-02-17 23:52:56
回答 6查看 66.8K关注 0票数 90

我正在阅读关于新功能的文章:http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html

我看到了下面的例子:

使用匿名类的

代码语言:javascript
复制
button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        System.out.println("Action Detected");
    }
});

使用Lambda的

代码语言:javascript
复制
button.addActionListener(e -> {
    System.out.println("Action Detected");
});

如果有人想在匿名类中实现多个方法,他们会对MouseListener做什么,例如:

代码语言:javascript
复制
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);
}

..。诸若此类?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-02-18 18:37:00

您可以通过使用helper接口将多方法接口与lambdas一起使用。这适用于这样的侦听器接口,其中不需要的方法的实现是微不足道的(即,我们也可以做MouseAdapter提供的事情):

代码语言:javascript
复制
// 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上的点击事件添加一个监听器,如下所示:

代码语言:javascript
复制
c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));
票数 84
EN

Stack Overflow用户

发布于 2014-02-18 00:03:25

来自JLS 9.8

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

Lambda需要这些函数接口,因此仅限于它们的单个方法。匿名接口仍然需要用于实现多方法接口。

代码语言:javascript
复制
addMouseListener(new MouseAdapter() {

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

    @Override
    public void mousePressed(MouseEvent e) {
      ...
    }
});
票数 94
EN

Stack Overflow用户

发布于 2014-04-30 03:48:04

Lambda EG确实考虑了这个问题。许多库使用函数式接口,即使它们是在函数式接口成为事物之前多年设计的。但有时确实会发生这样的情况:一个类有多个抽象方法,而您只想用lambda来针对其中的一个方法。

这里官方推荐的模式是定义工厂方法:

代码语言:javascript
复制
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }

这些可以由API本身直接完成(这些可以是MouseListener中的静态方法),也可以是其他库中的外部辅助方法(如果维护者选择不提供这种便利的话)。因为需要这样做的情况集很小,而解决方法又是如此简单,所以似乎没有必要进一步扩展语言来挽救这个角落案例。

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

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

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21833537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档