3 回答
TA贡献1824条经验 获得超5个赞
您可以通过使用辅助程序接口将多方法接口与lambda一起使用。这适用于这样的侦听器接口,在这些接口中,不需要的方法的实现是微不足道的(即,我们也可以做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 !"));
TA贡献1821条经验 获得超6个赞
Lambda EG确实考虑了这个问题。许多库都使用功能接口,即使它们是在功能接口成为现实之前就设计的。但是有时候确实会发生一个类具有多个抽象方法的情况,而您只想使用lambda来定位其中的一个。
此处官方推荐的模式是定义工厂方法:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
这些可以由API本身直接完成(这些可以是内的静态方法MouseListener),也可以是其他一些库中的外部帮助器方法(如果维护者选择不提供这种便利)。因为需要这种情况的情况很小,而且解决方法非常简单,所以似乎并没有要求进一步扩展语言以挽救这种极端情况。
采用了类似的技巧ThreadLocal; 请参阅新的静态工厂方法withInitial(Supplier<S>)。
(顺便说一句,当出现此问题时,示例几乎总是MouseListener,这是令人鼓舞的,因为它表明希望对lambda友好但对lambda友好的类的集合实际上很小。)
添加回答
举报