Java 8 Lambda Expressions - о нескольких методах в вложенном классе
Я читаю о новых функциях: http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html
Я увидел пример ниже:
Использование анонимного класса:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Action Detected");
}
});
С Лямбдой:
button.addActionListener(e -> {
System.out.println("Action Detected");
});
Что бы кто-то сделал с MouseListener
если они хотели реализовать несколько методов в анонимном классе, например:
public void mousePressed(MouseEvent e) {
saySomething("Mouse pressed; # of clicks: "
+ e.getClickCount(), e);
}
public void mouseReleased(MouseEvent e) {
saySomething("Mouse released; # of clicks: "
+ e.getClickCount(), e);
}
... и так далее?
Ответы
Ответ 1
Из JLS 9.8
Функциональный интерфейс - это интерфейс, который имеет только один абстрактный метод и, следовательно, представляет собой контракт с одной функцией.
Lambdas требуют этих функциональных интерфейсов, поэтому они ограничены их единственным методом. Анонимные интерфейсы по-прежнему необходимо использовать для реализации интерфейсов с несколькими методами.
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
...
}
@Override
public void mousePressed(MouseEvent e) {
...
}
});
Ответ 2
Вы можете использовать интерфейсы multi-method с lambdas, используя вспомогательные интерфейсы. Это работает с такими интерфейсами-слушателями, где реализации нежелательных методов тривиальны (т.е. Мы можем просто делать то, что предлагает MouseAdapter
):
// note the absence of mouseClicked…
interface ClickedListener extends MouseListener
{
@Override
public default void mouseEntered(MouseEvent e) {}
@Override
public default void mouseExited(MouseEvent e) {}
@Override
public default void mousePressed(MouseEvent e) {}
@Override
public default void mouseReleased(MouseEvent e) {}
}
Вы должны определить такой вспомогательный интерфейс только один раз.
Теперь вы можете добавить слушателя для событий click-событий на Component
c
следующим образом:
c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));
Ответ 3
Эмблема Lambda рассмотрела эту проблему. Многие библиотеки используют функциональные интерфейсы, хотя они были разработаны за несколько лет до того, как функциональный интерфейс стал чем-то. Но иногда бывает, что класс имеет несколько абстрактных методов, и вы только хотите настроить таргетинг на один из них с помощью лямбда.
Официально рекомендуемая схема здесь заключается в определении методов factory:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
Они могут выполняться непосредственно самими API (это могут быть статические методы внутри MouseListener
) или могут быть внешними вспомогательными методами в какой-либо другой библиотеке, если разработчики предпочитают не предлагать это удобство. Поскольку множество ситуаций, в которых это было необходимо, невелико, и обходной путь настолько прост, что, похоже, не требуется расширять язык для спасения этого углового случая.
Аналогичный трюк был применен для ThreadLocal
; см. новый статический метод factory withInitial(Supplier<S>)
.
(Кстати, когда эта проблема возникает, пример почти всегда MouseListener
, что обнадеживает, так как предлагает набор классов, которые хотели бы быть лямбда-дружелюбными, но не являются, на самом деле довольно маленькими.)
Ответ 4
Java ActionListener
должен реализовать только один метод (actionPerformed(ActionEvent e)
). Это хорошо вписывается в Java 8 function, поэтому Java 8 обеспечивает простой лямбда для реализации ActionListener
.
Для MouseAdapter
требуется по крайней мере два метода, поэтому не подходит как function
.
Ответ 5
Лямбда-выражения подходят там, где функциональный интерфейс должен содержать только одно объявление абстрактного метода
Ответ 6
Я был наконец достаточно обеспокоен этим, чтобы решить это раз и навсегда. Должно быть довольно просто настроить для любого интерфейса слушателя. Я надеюсь, что это будет включено в будущий выпуск Java...
Эта реализация также освобождает вас от попыток перехвата исключений - они перебрасываются как обернутые исключения RuntimeException.
Мой оригинальный класс также содержит реализации для WindowFocusListener, TableModelListener, TableColumnModelListener и TreeModelListener, но это выдвинуло код за предел SO в 30000 символов.
Обратите внимание на адаптер InsertOrRemoveUpdate, который объединяет 2 события в одно.
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;
import javax.swing.event.*;
import org.slf4j.*;
public class Adapters {
private static final Logger LOGGER = LoggerFactory.getLogger(Adapters.class);
@FunctionalInterface
public static interface AdapterEventHandler<EVENT> {
void handle(EVENT e) throws Exception;
default void handleWithRuntimeException(EVENT e) {
try {
handle(e);
}
catch(Exception exception) {
throw exception instanceof RuntimeException ? (RuntimeException) exception : new RuntimeException(exception);
}
}
}
public static void main(String[] args) throws Exception {
// -------------------------------------------------------------------------------------------------------------------------------------
// demo usage
// -------------------------------------------------------------------------------------------------------------------------------------
JToggleButton toggleButton = new JToggleButton();
JFrame frame = new JFrame();
JTextField textField = new JTextField();
JScrollBar scrollBar = new JScrollBar();
ListSelectionModel listSelectionModel = new DefaultListSelectionModel();
// ActionListener
toggleButton.addActionListener(ActionPerformed.handle(e -> LOGGER.info(e.toString())));
// ItemListener
toggleButton.addItemListener(ItemStateChanged.handle(e -> LOGGER.info(e.toString())));
// ChangeListener
toggleButton.addChangeListener(StateChanged.handle(e -> LOGGER.info(e.toString())));
// MouseListener
frame.addMouseListener(MouseClicked.handle(e -> LOGGER.info(e.toString())));
frame.addMouseListener(MousePressed.handle(e -> LOGGER.info(e.toString())));
frame.addMouseListener(MouseReleased.handle(e -> LOGGER.info(e.toString())));
frame.addMouseListener(MouseEntered.handle(e -> LOGGER.info(e.toString())));
frame.addMouseListener(MouseExited.handle(e -> LOGGER.info(e.toString())));
// MouseMotionListener
frame.addMouseMotionListener(MouseDragged.handle(e -> LOGGER.info(e.toString())));
frame.addMouseMotionListener(MouseMoved.handle(e -> LOGGER.info(e.toString())));
// MouseWheelListenere
frame.addMouseWheelListener(MouseWheelMoved.handle(e -> LOGGER.info(e.toString())));
// KeyListener
frame.addKeyListener(KeyTyped.handle(e -> LOGGER.info(e.toString())));
frame.addKeyListener(KeyPressed.handle(e -> LOGGER.info(e.toString())));
frame.addKeyListener(KeyReleased.handle(e -> LOGGER.info(e.toString())));
// FocusListener
frame.addFocusListener(FocusGained.handle(e -> LOGGER.info(e.toString())));
frame.addFocusListener(FocusLost.handle(e -> LOGGER.info(e.toString())));
// ComponentListener
frame.addComponentListener(ComponentMoved.handle(e -> LOGGER.info(e.toString())));
frame.addComponentListener(ComponentResized.handle(e -> LOGGER.info(e.toString())));
frame.addComponentListener(ComponentShown.handle(e -> LOGGER.info(e.toString())));
frame.addComponentListener(ComponentHidden.handle(e -> LOGGER.info(e.toString())));
// ContainerListener
frame.addContainerListener(ComponentAdded.handle(e -> LOGGER.info(e.toString())));
frame.addContainerListener(ComponentRemoved.handle(e -> LOGGER.info(e.toString())));
// HierarchyListener
frame.addHierarchyListener(HierarchyChanged.handle(e -> LOGGER.info(e.toString())));
// PropertyChangeListener
frame.addPropertyChangeListener(PropertyChange.handle(e -> LOGGER.info(e.toString())));
frame.addPropertyChangeListener("propertyName", PropertyChange.handle(e -> LOGGER.info(e.toString())));
// WindowListener
frame.addWindowListener(WindowOpened.handle(e -> LOGGER.info(e.toString())));
frame.addWindowListener(WindowClosing.handle(e -> LOGGER.info(e.toString())));
frame.addWindowListener(WindowClosed.handle(e -> LOGGER.info(e.toString())));
frame.addWindowListener(WindowIconified.handle(e -> LOGGER.info(e.toString())));
frame.addWindowListener(WindowDeiconified.handle(e -> LOGGER.info(e.toString())));
frame.addWindowListener(WindowActivated.handle(e -> LOGGER.info(e.toString())));
frame.addWindowListener(WindowDeactivated.handle(e -> LOGGER.info(e.toString())));
// WindowStateListener
frame.addWindowStateListener(WindowStateChanged.handle(e -> LOGGER.info(e.toString())));
// DocumentListener
textField.getDocument().addDocumentListener(InsertUpdate.handle(e -> LOGGER.info(e.toString())));
textField.getDocument().addDocumentListener(RemoveUpdate.handle(e -> LOGGER.info(e.toString())));
textField.getDocument().addDocumentListener(InsertOrRemoveUpdate.handle(e -> LOGGER.info(e.toString())));
textField.getDocument().addDocumentListener(ChangedUpdate.handle(e -> LOGGER.info(e.toString())));
// AdjustmentListener
scrollBar.addAdjustmentListener(AdjustmentValueChanged.handle(e -> LOGGER.info(e.toString())));
// ListSelectionListener
listSelectionModel.addListSelectionListener(ValueChanged.handle(e -> LOGGER.info(e.toString())));
// ...
// enhance as needed
}
// @formatter:off
// ---------------------------------------------------------------------------------------------------------------------------------------
// ActionListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class ActionPerformed implements ActionListener {
private AdapterEventHandler<ActionEvent> m_handler = null;
public static ActionPerformed handle(AdapterEventHandler<ActionEvent> handler) { ActionPerformed adapter = new ActionPerformed(); adapter.m_handler = handler; return adapter; }
@Override public void actionPerformed(ActionEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// ItemListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class ItemStateChanged implements ItemListener {
private AdapterEventHandler<ItemEvent> m_handler = null;
public static ItemStateChanged handle(AdapterEventHandler<ItemEvent> handler) { ItemStateChanged adapter = new ItemStateChanged(); adapter.m_handler = handler; return adapter; }
@Override public void itemStateChanged(ItemEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// ChangeListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class StateChanged implements ChangeListener {
private AdapterEventHandler<ChangeEvent> m_handler = null;
public static StateChanged handle(AdapterEventHandler<ChangeEvent> handler) { StateChanged adapter = new StateChanged(); adapter.m_handler = handler; return adapter; }
@Override public void stateChanged(ChangeEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// MouseListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class MouseClicked extends MouseAdapter {
private AdapterEventHandler<MouseEvent> m_handler = null;
public static MouseClicked handle(AdapterEventHandler<MouseEvent> handler) { MouseClicked adapter = new MouseClicked(); adapter.m_handler = handler; return adapter; }
@Override public void mouseClicked(MouseEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class MousePressed extends MouseAdapter {
private AdapterEventHandler<MouseEvent> m_handler = null;
public static MousePressed handle(AdapterEventHandler<MouseEvent> handler) { MousePressed adapter = new MousePressed(); adapter.m_handler = handler; return adapter; }
@Override public void mousePressed(MouseEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class MouseReleased extends MouseAdapter {
private AdapterEventHandler<MouseEvent> m_handler = null;
public static MouseReleased handle(AdapterEventHandler<MouseEvent> handler) { MouseReleased adapter = new MouseReleased(); adapter.m_handler = handler; return adapter; }
@Override public void mouseReleased(MouseEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class MouseEntered extends MouseAdapter {
private AdapterEventHandler<MouseEvent> m_handler = null;
public static MouseEntered handle(AdapterEventHandler<MouseEvent> handler) { MouseEntered adapter = new MouseEntered(); adapter.m_handler = handler; return adapter; }
@Override public void mouseEntered(MouseEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class MouseExited extends MouseAdapter {
private AdapterEventHandler<MouseEvent> m_handler = null;
public static MouseExited handle(AdapterEventHandler<MouseEvent> handler) { MouseExited adapter = new MouseExited(); adapter.m_handler = handler; return adapter; }
@Override public void mouseExited(MouseEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// MouseMotionListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class MouseDragged extends MouseAdapter {
private AdapterEventHandler<MouseEvent> m_handler = null;
public static MouseDragged handle(AdapterEventHandler<MouseEvent> handler) { MouseDragged adapter = new MouseDragged(); adapter.m_handler = handler; return adapter; }
@Override public void mouseDragged(MouseEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class MouseMoved extends MouseAdapter {
private AdapterEventHandler<MouseEvent> m_handler = null;
public static MouseMoved handle(AdapterEventHandler<MouseEvent> handler) { MouseMoved adapter = new MouseMoved(); adapter.m_handler = handler; return adapter; }
@Override public void mouseMoved(MouseEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// MouseWheelListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class MouseWheelMoved extends MouseAdapter {
private AdapterEventHandler<MouseWheelEvent> m_handler = null;
public static MouseWheelMoved handle(AdapterEventHandler<MouseWheelEvent> handler) { MouseWheelMoved adapter = new MouseWheelMoved(); adapter.m_handler = handler; return adapter; }
@Override public void mouseWheelMoved(MouseWheelEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// KeyListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class KeyTyped extends KeyAdapter {
private AdapterEventHandler<KeyEvent> m_handler = null;
public static KeyTyped handle(AdapterEventHandler<KeyEvent> handler) { KeyTyped adapter = new KeyTyped(); adapter.m_handler = handler; return adapter; }
@Override public void keyTyped(KeyEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class KeyPressed extends KeyAdapter {
private AdapterEventHandler<KeyEvent> m_handler = null;
public static KeyPressed handle(AdapterEventHandler<KeyEvent> handler) { KeyPressed adapter = new KeyPressed(); adapter.m_handler = handler; return adapter; }
@Override public void keyPressed(KeyEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class KeyReleased extends KeyAdapter {
private AdapterEventHandler<KeyEvent> m_handler = null;
public static KeyReleased handle(AdapterEventHandler<KeyEvent> handler) { KeyReleased adapter = new KeyReleased(); adapter.m_handler = handler; return adapter; }
@Override public void keyReleased(KeyEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// FocusListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class FocusGained extends FocusAdapter {
private AdapterEventHandler<FocusEvent> m_handler = null;
public static FocusGained handle(AdapterEventHandler<FocusEvent> handler) { FocusGained adapter = new FocusGained(); adapter.m_handler = handler; return adapter; }
@Override public void focusGained(FocusEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class FocusLost extends FocusAdapter {
private AdapterEventHandler<FocusEvent> m_handler = null;
public static FocusLost handle(AdapterEventHandler<FocusEvent> handler) { FocusLost adapter = new FocusLost(); adapter.m_handler = handler; return adapter; }
@Override public void focusLost(FocusEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// ComponentListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class ComponentMoved extends ComponentAdapter {
private AdapterEventHandler<ComponentEvent> m_handler = null;
public static ComponentMoved handle(AdapterEventHandler<ComponentEvent> handler) { ComponentMoved adapter = new ComponentMoved(); adapter.m_handler = handler; return adapter; }
@Override public void componentMoved(ComponentEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class ComponentResized extends ComponentAdapter {
private AdapterEventHandler<ComponentEvent> m_handler = null;
public static ComponentResized handle(AdapterEventHandler<ComponentEvent> handler) { ComponentResized adapter = new ComponentResized(); adapter.m_handler = handler; return adapter; }
@Override public void componentResized(ComponentEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class ComponentShown extends ComponentAdapter {
private AdapterEventHandler<ComponentEvent> m_handler = null;
public static ComponentShown handle(AdapterEventHandler<ComponentEvent> handler) { ComponentShown adapter = new ComponentShown(); adapter.m_handler = handler; return adapter; }
@Override public void componentShown(ComponentEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class ComponentHidden extends ComponentAdapter {
private AdapterEventHandler<ComponentEvent> m_handler = null;
public static ComponentHidden handle(AdapterEventHandler<ComponentEvent> handler) { ComponentHidden adapter = new ComponentHidden(); adapter.m_handler = handler; return adapter; }
@Override public void componentHidden(ComponentEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// ContainerListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class ComponentAdded extends ContainerAdapter {
private AdapterEventHandler<ContainerEvent> m_handler = null;
public static ComponentAdded handle(AdapterEventHandler<ContainerEvent> handler) { ComponentAdded adapter = new ComponentAdded(); adapter.m_handler = handler; return adapter; }
@Override public void componentAdded(ContainerEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class ComponentRemoved extends ContainerAdapter {
private AdapterEventHandler<ContainerEvent> m_handler = null;
public static ComponentRemoved handle(AdapterEventHandler<ContainerEvent> handler) { ComponentRemoved adapter = new ComponentRemoved(); adapter.m_handler = handler; return adapter; }
@Override public void componentRemoved(ContainerEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// HierarchyListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class HierarchyChanged implements HierarchyListener {
private AdapterEventHandler<HierarchyEvent> m_handler = null;
public static HierarchyChanged handle(AdapterEventHandler<HierarchyEvent> handler) { HierarchyChanged adapter = new HierarchyChanged(); adapter.m_handler = handler; return adapter; }
@Override public void hierarchyChanged(HierarchyEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// PropertyChangeListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class PropertyChange implements PropertyChangeListener {
private AdapterEventHandler<PropertyChangeEvent> m_handler = null;
public static PropertyChange handle(AdapterEventHandler<PropertyChangeEvent> handler) { PropertyChange adapter = new PropertyChange(); adapter.m_handler = handler; return adapter; }
@Override public void propertyChange(PropertyChangeEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// WindowListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class WindowOpened extends WindowAdapter {
private AdapterEventHandler<WindowEvent> m_handler = null;
public static WindowOpened handle(AdapterEventHandler<WindowEvent> handler) { WindowOpened adapter = new WindowOpened(); adapter.m_handler = handler; return adapter; }
@Override public void windowOpened(WindowEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class WindowClosing extends WindowAdapter {
private AdapterEventHandler<WindowEvent> m_handler = null;
public static WindowClosing handle(AdapterEventHandler<WindowEvent> handler) { WindowClosing adapter = new WindowClosing(); adapter.m_handler = handler; return adapter; }
@Override public void windowClosing(WindowEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class WindowClosed extends WindowAdapter {
private AdapterEventHandler<WindowEvent> m_handler = null;
public static WindowClosed handle(AdapterEventHandler<WindowEvent> handler) { WindowClosed adapter = new WindowClosed(); adapter.m_handler = handler; return adapter; }
@Override public void windowClosed(WindowEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class WindowIconified extends WindowAdapter {
private AdapterEventHandler<WindowEvent> m_handler = null;
public static WindowIconified handle(AdapterEventHandler<WindowEvent> handler) { WindowIconified adapter = new WindowIconified(); adapter.m_handler = handler; return adapter; }
@Override public void windowIconified(WindowEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class WindowDeiconified extends WindowAdapter {
private AdapterEventHandler<WindowEvent> m_handler = null;
public static WindowDeiconified handle(AdapterEventHandler<WindowEvent> handler) { WindowDeiconified adapter = new WindowDeiconified(); adapter.m_handler = handler; return adapter; }
@Override public void windowDeiconified(WindowEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class WindowActivated extends WindowAdapter {
private AdapterEventHandler<WindowEvent> m_handler = null;
public static WindowActivated handle(AdapterEventHandler<WindowEvent> handler) { WindowActivated adapter = new WindowActivated(); adapter.m_handler = handler; return adapter; }
@Override public void windowActivated(WindowEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class WindowDeactivated extends WindowAdapter {
private AdapterEventHandler<WindowEvent> m_handler = null;
public static WindowDeactivated handle(AdapterEventHandler<WindowEvent> handler) { WindowDeactivated adapter = new WindowDeactivated(); adapter.m_handler = handler; return adapter; }
@Override public void windowDeactivated(WindowEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// WindowStateListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class WindowStateChanged extends WindowAdapter {
private AdapterEventHandler<WindowEvent> m_handler = null;
public static WindowStateChanged handle(AdapterEventHandler<WindowEvent> handler) { WindowStateChanged adapter = new WindowStateChanged(); adapter.m_handler = handler; return adapter; }
@Override public void windowStateChanged(WindowEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// DocumentListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class DocumentAdapter implements DocumentListener {
@Override public void insertUpdate(DocumentEvent e) { /* nothing */ }
@Override public void removeUpdate(DocumentEvent e) { /* nothing */ }
@Override public void changedUpdate(DocumentEvent e) { /* nothing */ }
}
public static class InsertUpdate extends DocumentAdapter {
private AdapterEventHandler<DocumentEvent> m_handler = null;
public static InsertUpdate handle(AdapterEventHandler<DocumentEvent> handler) { InsertUpdate adapter = new InsertUpdate(); adapter.m_handler = handler; return adapter; }
@Override public void insertUpdate(DocumentEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class RemoveUpdate extends DocumentAdapter {
private AdapterEventHandler<DocumentEvent> m_handler = null;
public static RemoveUpdate handle(AdapterEventHandler<DocumentEvent> handler) { RemoveUpdate adapter = new RemoveUpdate(); adapter.m_handler = handler; return adapter; }
@Override public void removeUpdate(DocumentEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class InsertOrRemoveUpdate extends DocumentAdapter {
private AdapterEventHandler<DocumentEvent> m_handler = null;
public static InsertOrRemoveUpdate handle(AdapterEventHandler<DocumentEvent> handler) { InsertOrRemoveUpdate adapter = new InsertOrRemoveUpdate(); adapter.m_handler = handler; return adapter; }
@Override public void insertUpdate(DocumentEvent e) { m_handler.handleWithRuntimeException(e); }
@Override public void removeUpdate(DocumentEvent e) { m_handler.handleWithRuntimeException(e); }
}
public static class ChangedUpdate extends DocumentAdapter {
private AdapterEventHandler<DocumentEvent> m_handler = null;
public static ChangedUpdate handle(AdapterEventHandler<DocumentEvent> handler) { ChangedUpdate adapter = new ChangedUpdate(); adapter.m_handler = handler; return adapter; }
@Override public void changedUpdate(DocumentEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// AdjustmentListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class AdjustmentValueChanged implements AdjustmentListener {
private AdapterEventHandler<AdjustmentEvent> m_handler = null;
public static AdjustmentValueChanged handle(AdapterEventHandler<AdjustmentEvent> handler) { AdjustmentValueChanged adapter = new AdjustmentValueChanged(); adapter.m_handler = handler; return adapter; }
@Override public void adjustmentValueChanged(AdjustmentEvent e) { m_handler.handleWithRuntimeException(e); }
}
// ---------------------------------------------------------------------------------------------------------------------------------------
// ListSelectionListener
// ---------------------------------------------------------------------------------------------------------------------------------------
public static class ValueChanged implements ListSelectionListener {
private AdapterEventHandler<ListSelectionEvent> m_handler = null;
public static ValueChanged handle(AdapterEventHandler<ListSelectionEvent> handler) { ValueChanged adapter = new ValueChanged(); adapter.m_handler = handler; return adapter; }
@Override public void valueChanged(ListSelectionEvent e) { m_handler.handleWithRuntimeException(e); }
}
// @formatter:on
}
Ответ 7
Невозможно получить доступ к методам по умолчанию из лямбда-выражений. Следующий код не компилируется:
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
Formula formula = (a) -> sqrt( a * 100);
работает только с функциональным интерфейсом (только один абстрактный метод + любое количество методов по умолчанию), поэтому работа lambda expresion работает только с абстрактным методом.