我有一个名为JButton的saveButton,希望它在单击save方法时调用它。当然,我们可以使用旧的方法来完成:
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
save();
}
});但是今天我想使用新的Java 8特性,比如方法引用。为什么
saveButton.addActionListener(this::save);不工作?它是如何使用方法引用的?
发布于 2014-10-11 22:14:25
方法actionPerformed(ActionEvent e)需要单参数e。如果要使用方法引用,则方法必须具有相同的签名。
private void myActionPerformed(ActionEvent e) {
save();
}然后可以使用方法引用:
saveButton.addActionListener(this::myActionPerformed);或者您可以使用lambda代替(注意e参数):
saveButton.addActionListener(e -> save());发布于 2014-10-11 22:03:46
你可以用蓝光:
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方式在实现你想要的东西方面更有效率,因为它是动态的。这毕竟是他们在那里的原因。
https://stackoverflow.com/questions/26319537
复制相似问题