0

我有一个JButton调用saveButton并希望它在save单击时调用该方法。当然,我们可以使用旧方法来做到这一点:

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

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

    saveButton.addActionListener(this::save);

不行?它是如何使用方法引用完成的?

4

2 回答 2

3

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

private void myActionPerformed(ActionEvent e) {
    save();
}

然后你可以使用方法参考:

saveButton.addActionListener(this::myActionPerformed);

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

saveButton.addActionListener(e -> save());
于 2014-10-11T22:14:25.000 回答
2

您可以使用 lambda:

saveButton.addActionListener((ActionEvent e) -> save());

可以这样做是因为 ActionListener 是一个功能接口(即只有一个方法)。功能接口是任何只包含一个抽象方法的接口。Lambda 是调用的简写。

除了使用 Lambda,您还可以通过让您的类实现相关接口(或其他具有实例变量的类)来使用方法引用。这是一个完整的例子:

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 方式在实现您想要的方面更有效。毕竟这就是他们在那里的原因。

于 2014-10-11T22:03:46.907 回答