Я читаю о новых функциях по адресу: 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");
});
Что бы кто-то сделал с a, 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);
}
... и так далее?
java
lambda
java-8
anonymous-class
Оптимальный прайм
источник
источник
actionPerformed
интерфейсаActionListener
?!MousePressedListener
и,MouseReleasedListener
и два методаaddMousePressedListener(Button, MousePressedListener)
иaddMouseReleasedListener(Button, MouseReleasedListener)
. Затем вы можете использовать лямбды для реализации этих обработчиков событий.Ответы:
Вы можете использовать интерфейсы с несколькими методами с лямбда-выражениями, используя вспомогательные интерфейсы. Это работает с такими интерфейсами слушателя, в которых реализация нежелательных методов тривиальна (т.е. мы можем просто делать то, что
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) {} }
Такой вспомогательный интерфейс нужно определить только один раз.
Теперь вы можете добавить прослушиватель событий щелчка
Component
c
примерно так:c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));
источник
mouseClicked
метод, который был объявлен вMouseListener
интерфейсе как абстрактный метод и не переопределенClickedListener
интерфейсом (отсюда и название).Начиная с JLS 9.8
Для лямбда-выражений требуются эти функциональные интерфейсы, поэтому они ограничиваются их единственным методом. Анонимные интерфейсы по-прежнему необходимо использовать для реализации интерфейсов с несколькими методами.
addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { ... } @Override public void mousePressed(MouseEvent e) { ... } });
источник
Lambda EG действительно рассмотрела этот вопрос. Многие библиотеки используют функциональные интерфейсы, хотя они были разработаны за годы до того, как функциональные интерфейсы стали реальностью. Но иногда бывает, что у класса есть несколько абстрактных методов, и вы хотите указать только один из них с помощью лямбда.
Официально рекомендуемый шаблон здесь - определение фабричных методов:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
Это может быть сделано непосредственно самими API (это могут быть статические методы внутри
MouseListener
) или могут быть внешними вспомогательными методами в какой-либо другой библиотеке, если сопровождающие решат не предлагать такое удобство. Поскольку набор ситуаций, в которых это было необходимо, невелик, а обходной путь настолько прост, не представлялось убедительным дальнейшее расширение языка для спасения этого углового случая.Подобный трюк был использован для
ThreadLocal
; см. новый статический фабричный методwithInitial(Supplier<S>)
.(Кстати, когда возникает эта проблема, пример почти всегда
MouseListener
, что обнадеживает, поскольку он предлагает набор классов, которые хотели бы быть лямбда-дружественными, но не являются, на самом деле довольно мал.)источник
WindowListener
, но их относительно немного.В Java
ActionListener
должен быть реализован только один единственный метод (actionPerformed(ActionEvent e)
). Это хорошо вписывается в функцию Java 8, поэтому Java 8 предоставляет простую лямбду для реализацииActionListener
.MouseAdapter
Требует , по меньшей мере , два метода так не подходит , какfunction
.источник
Я создал классы адаптеров, которые позволяют мне писать (однострочные) слушатели лямбда-функции, даже если исходный интерфейс слушателя содержит более одного метода.
Обратите внимание на адаптер InsertOrRemoveUpdate, который сворачивает 2 события в одно.
Мой исходный класс также содержал реализации для WindowFocusListener, TableModelListener, TableColumnModelListener и TreeModelListener, но это подтолкнуло код к пределу SO в 30000 символов.
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 }
источник
К методам по умолчанию нельзя получить доступ из лямбда-выражений. Следующий код не компилируется:
interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } } Formula formula = (a) -> sqrt( a * 100);
работать только с функциональным интерфейсом (только один абстрактный метод + любое количество методов по умолчанию), поэтому лямбда-выражение работает только с абстрактным методом
источник