В Java интерфейсы с одним абстрактным методом (т.е. типы 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!")
);
Но для интерфейсов с несколькими абстрактными методами лямбда не может быть применена непосредственно. Например, 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!");
}
}
);
но есть ли более элегантный способ с лямбдами?
@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-типов. Поэтому этот вопрос не является дубликатом Java 8 Lambda Expressions - о нескольких методах в вложенном классе.