在Java中,使用lambda而不是匿名类可以优雅地实现具有单个抽象方法(即SAM类型或功能接口)的接口:
// 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!")
);
但对于具有多个抽象方法的接口,无法直接应用lambda.例如,java.awt.event.WindowListener有七种方法.但通常一块代码只对定义这七种方法中的一种感兴趣.
要使用匿名类覆盖来实现该行为,我们可以:
// 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!");
}
}
注意:@ maythesource.com提出了一个类似但更广泛的问题:" 如果想要在匿名类中实现多个方法,那么有人会使用MouseListener做什么? "最受欢迎和接受的答案是使用匿名实现.我的问题是关于非SAM类型的优雅lambda解决方案.因此,这个问题是不是重复的的Java 8 Lambda表达式-怎么样在嵌套类中的多个方法.