3 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以通過使用輔助程序接口將多方法接口與lambda一起使用。這適用于這樣的偵聽器接口,在這些接口中,不需要的方法的實(shí)現(xiàn)是微不足道的(即,我們也可以做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) {}
}
您只需要定義一次這樣的幫助程序接口。
現(xiàn)在,您可以Component c像這樣添加點(diǎn)擊事件的偵聽器:
c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
Lambda EG確實(shí)考慮了這個(gè)問題。許多庫都使用功能接口,即使它們是在功能接口成為現(xiàn)實(shí)之前就設(shè)計(jì)的。但是有時(shí)候確實(shí)會(huì)發(fā)生一個(gè)類具有多個(gè)抽象方法的情況,而您只想使用lambda來定位其中的一個(gè)。
此處官方推薦的模式是定義工廠方法:
static MouseListener clickHandler(Consumer<MouseEvent> c) { return ... }
這些可以由API本身直接完成(這些可以是內(nèi)的靜態(tài)方法MouseListener),也可以是其他一些庫中的外部幫助器方法(如果維護(hù)者選擇不提供這種便利)。因?yàn)樾枰@種情況的情況很小,而且解決方法非常簡單,所以似乎并沒有要求進(jìn)一步擴(kuò)展語言以挽救這種極端情況。
采用了類似的技巧ThreadLocal; 請(qǐng)參閱新的靜態(tài)工廠方法withInitial(Supplier<S>)。
(順便說一句,當(dāng)出現(xiàn)此問題時(shí),示例幾乎總是MouseListener,這是令人鼓舞的,因?yàn)樗砻飨M麑?duì)lambda友好但對(duì)lambda友好的類的集合實(shí)際上很小。)
添加回答
舉報(bào)