// SAM ActionListener with anonymous implementation button.addActionListener( new ActionListener(){ public void actionPerformed(Event e){ System.out.println("button via anon!"); } } );
可以替换为:
// SAM ActionListener with lambda implementation button.addActionListener( e -> System.out.println("button via lambda!") );
// non-SAM with adapter implementation with override window.addWindowListener( new WindowAdapter() { @Override public void windowOpened(Event e){ System.out.println("WindowAdapter opened via override!"); } } );
但是有一个更优雅的方式与lambdas?
@FunctionalInterface public interface ActionListener { void actionPerformed(Event e); } public interface WindowListener { void windowOpened(Event e); void windowClosing(Event e); } public class WindowAdapter implements WindowListener { public void windowOpened(Event e){ System.out.println("windowOpened in adapter!"); } public void windowClosing(Event e){ System.out.println("windowClosing in adapter!"); } }
// SAM bridge with lambda implementation window.addWindowListener( WindowBridge.windowOpened( b -> System.out.println("opening via lambda!") ) );
与SAM类型的情况一样,它比匿名适配器更干净:
// non-SAM with adapter implementation with override window.addWindowListener( new WindowAdapter() { @Override public void windowOpened(Event e){ System.out.println("WindowAdapter opened via override!"); } } );
但它确实需要一个与静态工厂有点尴尬的桥梁:
import java.util.function.Consumer; public interface WindowBridge { // SAM for this method public abstract class WindowOpened extends WindowAdapter { public abstract void windowOpened(Event e); } // factory bridge public static WindowOpened windowOpened(Consumer c) { return new WindowOpened() { public void windowOpened(Event e){ c.accept(e); } }; } // SAM for this method public abstract class WindowClosing extends WindowAdapter { public abstract void windowClosing(Event e); } // factory bridge public static WindowClosing windowClosing(Consumer c) { return new WindowClosing() { public void windowClosing(Event e){ c.accept(e); } }; } }