使用方法引用

时间:2014-10-11 21:40:52

标签: java actionlistener java-8 method-reference

我有一个名为JButton的{​​{1}},并希望它在点击时调用saveButton方法。当然,我们可以使用旧方法来做到这一点:

save

但今天我想使用像方法引用这样的新Java 8功能。为什么

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

不行吗?如何使用方法引用完成?

2 个答案:

答案 0 :(得分:2)

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

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

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

saveButton.addActionListener(this::myActionPerformed);

或者你可以改用lambda(注意e参数):

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

答案 1 :(得分:1)

您可以使用lambda:

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

这可以完成,因为ActionListener是一个功能接口(即只有一种方法)。功能接口是仅包含一个抽象方法的任何接口。 Lambdas是电话的简写。

除了使用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方式在实现你想要的东西方面更有效率,因为它具有动态特性。毕竟这就是为什么他们在那里。