首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用方法参考

使用方法参考
EN

Stack Overflow用户
提问于 2014-10-11 21:40:52
回答 2查看 1.2K关注 0票数 0

我有一个名为JButtonsaveButton,希望它在单击save方法时调用它。当然,我们可以使用旧的方法来完成:

代码语言:javascript
复制
    saveButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            save();
        }
    });

但是今天我想使用新的Java 8特性,比如方法引用。为什么

代码语言:javascript
复制
    saveButton.addActionListener(this::save);

不工作?它是如何使用方法引用的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-11 22:14:25

方法actionPerformed(ActionEvent e)需要单参数e。如果要使用方法引用,则方法必须具有相同的签名。

代码语言:javascript
复制
private void myActionPerformed(ActionEvent e) {
    save();
}

然后可以使用方法引用:

代码语言:javascript
复制
saveButton.addActionListener(this::myActionPerformed);

或者您可以使用lambda代替(注意e参数):

代码语言:javascript
复制
saveButton.addActionListener(e -> save());
票数 3
EN

Stack Overflow用户

发布于 2014-10-11 22:03:46

你可以用蓝光:

代码语言:javascript
复制
saveButton.addActionListener((ActionEvent e) -> save());

这是可以完成的,因为ActionListener是一个功能接口(即只有一个方法)。函数接口是指只包含一个抽象方法的任何接口。Lambdas是呼叫的缩写。

或者,要使用Lambda,您可以使用方法引用,方法是让类实现有问题的接口(或者使用实例变量的其他类)。下面是一个完整的例子:

代码语言:javascript
复制
public class Scratch implements ActionListener {

    static JButton saveButton = new JButton();

    public void save(){};

    public void contrivedExampleMethod() {

        saveButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                save();
            }
        });

        // This works regarless of whether or not this class
        // implements ActionListener, LAMBDA VERSION
        saveButton.addActionListener((ActionEvent e) -> save());

        // For this to work we must ensure they match
        // hence this can be done, METHOD REFERENCE VERSION
        saveButton.addActionListener(this::actionPerformed);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        save();
    }
}

当然,这只是一个人为的例子,但可以通过任何一种方法来完成,前提是您要传递正确的方法,或者使用Lambdas创建正确的内部类(类似)实现。我认为lambda方式在实现你想要的东西方面更有效率,因为它是动态的。这毕竟是他们在那里的原因。

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

https://stackoverflow.com/questions/26319537

复制
相关文章

相似问题

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