我有一个名为JButton
的{{1}},并希望它在点击时调用saveButton
方法。当然,我们可以使用旧方法来做到这一点:
save
但今天我想使用像方法引用这样的新Java 8功能。为什么
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
save();
}
});
不行吗?如何使用方法引用完成?
答案 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方式在实现你想要的东西方面更有效率,因为它具有动态特性。毕竟这就是为什么他们在那里。