第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 8 Lambda表達式-嵌套類中的多個方法呢?

Java 8 Lambda表達式-嵌套類中的多個方法呢?

BIG陽 2019-10-29 10:45:17
我在以下位置閱讀有關(guān)新功能的信息: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想要在匿名類中實現(xiàn)多個方法,該怎么辦,例如: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);}... 等等?
查看完整描述

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) {

      ...

    }

});


查看完整回答
反對 回復 2019-10-29
?
HUH函數(shù)

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 !"));


查看完整回答
反對 回復 2019-10-29
?
躍然一笑

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友好的類的集合實際上很小。)


查看完整回答
反對 回復 2019-10-29
  • 3 回答
  • 0 關(guān)注
  • 1143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號