欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java通過(guò)匿名類來(lái)實(shí)現(xiàn)回調(diào)函數(shù)實(shí)例總結(jié)

 更新時(shí)間:2017年08月21日 16:19:51   投稿:sss  
這篇文章主要介紹了Java通過(guò)匿名類來(lái)實(shí)現(xiàn)回調(diào)函數(shù)的例子,回調(diào)函數(shù)就是一種函數(shù)簽名(若干個(gè)輸入?yún)?shù)、一個(gè)輸出參數(shù))的規(guī)范,java雖不存在函數(shù)聲明,但是java可以用接口來(lái)強(qiáng)制規(guī)范。具體操作步驟大家可查看下文的詳細(xì)講解,感興趣的小伙伴們可以參考一下。

在C語(yǔ)言中,函數(shù)名可以當(dāng)做函數(shù)指針傳遞給形參從而實(shí)現(xiàn)回調(diào)

void f1() { printf("f1()\n"); }
void f2() { printf("f2()\n"); }
void f3() { printf("f3()\n"); }
void do_func(void(*f)()) { f(); }
int main()
{
  do_func(f1);
  do_func(f2);
  do_func(f3);
}

在C++11中,實(shí)現(xiàn)回調(diào)還可以通過(guò)函數(shù)模板和lambda表達(dá)式的方式

template <typename Func>
void do_func(Func f) { f(); }
int main()
{
  do_func([]() { printf("f1()"); });
  do_func([]() { printf("f2()"); });
  do_func([]() { printf("f3()"); });
}

而假如回調(diào)函數(shù)的代碼實(shí)現(xiàn)較為復(fù)雜,且具有重用價(jià)值,lambda表達(dá)式這種一次性的方案就不太適合,在C++11之前,是通過(guò)函數(shù)對(duì)象來(lái)實(shí)現(xiàn)的。函數(shù)對(duì)象說(shuō)白了就是一個(gè)類的普通對(duì)象,只不過(guò)C++可以重載括號(hào)運(yùn)算符,導(dǎo)致調(diào)用類的對(duì)象的operator()方法時(shí),就像調(diào)用函數(shù)一樣自然。

而分析本質(zhì),其實(shí)回調(diào)函數(shù)就是一種函數(shù)簽名(若干個(gè)輸入?yún)?shù)、一個(gè)輸出參數(shù))的規(guī)范,java雖不存在函數(shù)聲明,但是java可以用接口來(lái)強(qiáng)制規(guī)范。

interface Funcable {
  void Func();
}

這樣只要實(shí)現(xiàn)了該接口的類,都有一個(gè)函數(shù)簽名和void Func()一致的成員函數(shù)(嘛,還是不習(xí)慣方法(method)這種叫法),于是只需要把實(shí)現(xiàn)了該接口的類的對(duì)象傳入函數(shù)中,然后在函數(shù)中調(diào)用該對(duì)象的Func()方法即可

class F1 implements Funcable {

  @Override
  public void Func() {
    System.out.println("f1()");
  } 
}
public class Test {
  
  public static void do_func(Funcable funcable) {
    funcable.Func();
  } 
  public static void main(String[] args) {
    do_func(new F1());
  }
}

這里節(jié)省代碼量,就不把類F2、F3給寫(xiě)出來(lái)了。并且利用java的匿名類可以節(jié)省代碼,類似于lambda表達(dá)式

  do_func(new Funcable() {      
      @Override
      public void Func() {
        System.out.println("f2()");
      }
    });

說(shuō)到lambda表達(dá)式,它是可以捕獲外部變量的,在Java這種方式還可以通過(guò)匿名內(nèi)的匿名構(gòu)造函數(shù)來(lái)顯式捕獲外部的變量

  String msg = "f3()";
    do_func(new Funcable() {
      String _msg; 
      {
        _msg = msg;
      } 
      @Override
      public void Func() {
        System.out.println(_msg);
      }
    });

這種做法就很像lambda表達(dá)式了,因?yàn)槟涿惖哪涿麡?gòu)造函數(shù)是只能以外部變量為構(gòu)造參數(shù)的,相當(dāng)于lambda表達(dá)式的“捕獲”,對(duì)應(yīng)C++的lambda表達(dá)式寫(xiě)法就是

 std::string msg = "f3()";
  do_func([&msg]() { std::cout << msg << std::endl; });

java8也有l(wèi)ambda表達(dá)式了,因此可以寫(xiě)成這樣

do_func(() -> { System.out.println(msg); });

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助~如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持!

相關(guān)文章

  • springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn)實(shí)例

    springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn)實(shí)例

    本篇文章主要介紹了詳解springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Java中Future和FutureTask的示例詳解及使用

    Java中Future和FutureTask的示例詳解及使用

    Java中的Future和FutureTask通常和線程池搭配使用,用來(lái)獲取線程池返回執(zhí)行后的返回值,下面這篇文章主要給大家介紹了關(guān)于Java中Future和FutureTask使用的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • java實(shí)現(xiàn)錄音播放功能

    java實(shí)現(xiàn)錄音播放功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)錄音播放功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 詳解MyBatis中column屬性的總結(jié)

    詳解MyBatis中column屬性的總結(jié)

    在MyBatis的映射中有column這么一個(gè)屬性,我一直以為它映射的是數(shù)據(jù)庫(kù)表中的列名,但經(jīng)過(guò)學(xué)習(xí)發(fā)現(xiàn)他似乎映射的是SQL語(yǔ)句中的列名,或者說(shuō)是查詢結(jié)果所得到的表的列名,這篇文章主要介紹了MyBatis中column屬性的總結(jié),需要的朋友可以參考下
    2022-09-09
  • 解決mybatis批量更新出現(xiàn)SQL報(bào)錯(cuò)問(wèn)題

    解決mybatis批量更新出現(xiàn)SQL報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了mybatis批量更新出現(xiàn)SQL報(bào)錯(cuò),解決辦法也很簡(jiǎn)單只需要在application.properties配置文中的數(shù)據(jù)源url后面添加一個(gè)參數(shù),需要的朋友可以參考下
    2022-02-02
  • Java中的運(yùn)算符你知道多少

    Java中的運(yùn)算符你知道多少

    這篇文章主要為大家詳細(xì)介紹了Java中的運(yùn)算符,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Java replaceAll()方法報(bào)錯(cuò)Illegal group reference的解決辦法

    Java replaceAll()方法報(bào)錯(cuò)Illegal group reference的解決辦法

    這篇文章主要給大家介紹了關(guān)于Java replaceAll()方法報(bào)錯(cuò)Illegal group reference的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • spring boot3整合AI組件及使用方法

    spring boot3整合AI組件及使用方法

    本文介紹了springboot開(kāi)發(fā)后端服務(wù)中,AI組件(Spring AI)的整合與使用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • java判斷字符串String是否為空問(wèn)題淺析

    java判斷字符串String是否為空問(wèn)題淺析

    這篇文章主要介紹了java判斷字符串String是否為空問(wèn)題,有需要的朋友可以參考一下
    2014-01-01
  • 引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問(wèn)題的解決方法

    引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問(wèn)題的解決方法

    這篇文章主要介紹了引入mybatis-plus報(bào) Invalid bound statement錯(cuò)誤問(wèn)題的解決方法,需要的朋友可以參考下
    2020-05-05

最新評(píng)論