How this code can be executed and compiled if at action.perform, the perform method is not even defined. And plus a command like editor at the time m.record(editor::save); , and the macro list itself is assigned to action type objects? How can this be?
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(); }