如果使用 action.perform,甚至没有定义 perform 方法,如何执行和编译这段代码。现在加上一个编辑器类型的命令,m.record(editor::save);宏列表本身是为动作类型的对象设计的?怎么会这样?
public class Macro {
List<Actiona> macro;
Macro(){
macro = new ArrayList<>();
}
public void record(Actiona action){
macro.add(action);
}
public void run(){
macro.forEach(Actiona::perform);
}
public static void main(String[] args) {
MockEditor editor = new MockEditor();
Macro m = new Macro();
m.record(editor::save);
m.record(editor::close);
m.run();
}
}
public class MockEditor implements Editor {
@Override
public void save() {
System.out.println("Save");
}
@Override
public void close() {
System.out.println("close");
}
}
public interface Actiona {
public void perform();
}
public interface Editor {
public void save();
public void close();
}
如果你去一个 IDE(比如 IDEA)并要求用一个匿名类替换 lambda,这个魔法很容易理解:
突然一切都变得简单明了,我们通过调用里面的
editor.save()and方法来实现 perform 方法editor.close(),所以行为是非常正确的。一个非常好的技能,一旦你对 lambda 函数感到困惑,用匿名类在心理上(或使用 IDE)替换它们,生活变得更容易。