3 回答

TA貢獻1946條經(jīng)驗 獲得超3個贊
從JLS 9.8起
功能接口是僅具有一種抽象方法的接口,因此表示單個功能協(xié)定。
Lambda需要這些功能接口,因此僅限于它們的單一方法。仍然需要使用匿名接口來實現(xiàn)多方法接口。
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
...
}
@Override
public void mousePressed(MouseEvent e) {
...
}
});

TA貢獻1836條經(jīng)驗 獲得超4個贊
您可以通過使用輔助程序接口將多方法接口與lambda一起使用。這適用于這樣的偵聽器接口,在這些接口中,不需要的方法的實現(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像這樣添加點擊事件的偵聽器:
c.addMouseListener((ClickedListener)(e)->System.out.println("Clicked !"));

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