我正在阅读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");
}
});
使用Lambda:
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);
}
... 等等?
来自JLS 9.8
功能接口是只有一个抽象方法的接口,因此代表单个函数契约。
Lambdas需要这些功能接口,因此仅限于其单一方法。匿名接口仍然需要用于实现多方法接口。
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
...
}
@Override
public void mousePressed(MouseEvent e) {
...
}
});
您可以使用辅助接口将多方法接口与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) {}
}
您只需要定义一次这样的辅助接口。
现在你可以在Component
c
上为click事件添加一个监听器,如下所示:
c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));
Lambda EG确实考虑过这个问题。许多库使用功能接口,即使它们是在功能接口成为事物之前的几年设计的。但有时会发生一个类有多个抽象方法,而你只想用lambda来定位其中一个。
这里官方推荐的模式是定义工厂方法:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
这些可以直接由API本身完成(这些可以是MouseListener
中的静态方法),或者如果维护者选择不提供这种便利,则可以是其他库中的外部辅助方法。因为需要这种情况的情况很少,并且解决方法非常简单,所以扩展语言以挽救这个角落的情况似乎并不引人注目。
ThreadLocal
采用了类似的技巧;看到新的静态工厂方法withInitial(Supplier<S>)
。
(顺便说一句,当这个问题出现时,这个例子几乎总是MouseListener
,这是令人鼓舞的,因为它表明那些想要成为lambda友好的类,但实际上并不是很小。)
Java ActionListener
必须只实现一个方法(actionPerformed(ActionEvent e)
)。这非常适合Java 8 function,因此Java 8提供了一个简单的lambda来实现ActionListener
。
MouseAdapter
需要至少两种方法,因此不适合作为function
。
我创建了允许我编写(单行)lambda函数侦听器的适配器类,即使原始侦听器接口包含多个方法也是如此。
请注意InsertOrRemoveUpdate适配器,它将2个事件折叠为一个。
我的原始类还包含WindowFocusListener,TableModelListener,TableColumnModelListener和TreeModelListener的实现,但是这些代码超过了30000个字符的SO限制。
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
}
无法从lambda表达式中访问默认方法。以下代码无法编译:
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
Formula formula = (a) -> sqrt( a * 100);
仅使用功能接口(仅使用单个抽象方法+任意数量的默认方法),因此lambda表达式仅使用抽象方法