最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

在C語言中,函數(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)還可以通過函數(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之前,是通過函數(shù)對象來實(shí)現(xiàn)的。函數(shù)對象說白了就是一個(gè)類的普通對象,只不過C++可以重載括號(hào)運(yùn)算符,導(dǎo)致調(diào)用類的對象的operator()方法時(shí),就像調(diào)用函數(shù)一樣自然。

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

interface Funcable {
  void Func();
}

這樣只要實(shí)現(xiàn)了該接口的類,都有一個(gè)函數(shù)簽名和void Func()一致的成員函數(shù)(嘛,還是不習(xí)慣方法(method)這種叫法),于是只需要把實(shí)現(xiàn)了該接口的類的對象傳入函數(shù)中,然后在函數(shù)中調(diào)用該對象的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給寫出來了。并且利用java的匿名類可以節(jié)省代碼,類似于lambda表達(dá)式

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

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

  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á)式的“捕獲”,對應(yīng)C++的lambda表達(dá)式寫法就是

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

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

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

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

相關(guān)文章

  • 分析Java并發(fā)編程之信號(hào)量Semaphore

    分析Java并發(fā)編程之信號(hào)量Semaphore

    Semaphore一般譯作信號(hào)量,它也是一種線程同步工具,主要用于多個(gè)線程對共享資源進(jìn)行并行操作的一種工具類。它代表了一種許可的概念,是否允許多線程對同一資源進(jìn)行操作的許可,使用Semaphore可以控制并發(fā)訪問資源的線程個(gè)數(shù)
    2021-06-06
  • java版微信公眾平臺(tái)后臺(tái)接入

    java版微信公眾平臺(tái)后臺(tái)接入

    這篇文章主要為大家詳細(xì)介紹了java版微信公眾平臺(tái)后臺(tái)接入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • MVC+DAO設(shè)計(jì)模式下的設(shè)計(jì)流程詳解

    MVC+DAO設(shè)計(jì)模式下的設(shè)計(jì)流程詳解

    這篇文章主要介紹了MVC+DAO設(shè)計(jì)模式下的設(shè)計(jì)流程詳解,分別介紹了數(shù)據(jù)庫設(shè)計(jì)、設(shè)計(jì)符合java bean標(biāo)準(zhǔn)的entity類、設(shè)計(jì)訪問數(shù)據(jù)庫的DAO接口等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 解決Java中由于數(shù)據(jù)太大自動(dòng)轉(zhuǎn)換成科學(xué)計(jì)數(shù)法的問題

    解決Java中由于數(shù)據(jù)太大自動(dòng)轉(zhuǎn)換成科學(xué)計(jì)數(shù)法的問題

    今天小編就為大家分享一篇解決Java中由于數(shù)據(jù)太大自動(dòng)轉(zhuǎn)換成科學(xué)計(jì)數(shù)法的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Spring Boot thymeleaf模板引擎的使用詳解

    Spring Boot thymeleaf模板引擎的使用詳解

    這篇文章主要介紹了Spring Boot thymeleaf模板引擎的使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 使用springboot aop記錄接口請求的參數(shù)及響應(yīng)

    使用springboot aop記錄接口請求的參數(shù)及響應(yīng)

    該文章介紹了如何使用SpringAOP的切面注解,如@Before和@AfterReturning,來記錄Controller層的方法輸入?yún)?shù)和響應(yīng)結(jié)果,還討論了@Around注解的靈活性,允許在方法執(zhí)行前后進(jìn)行更多控制,需要的朋友可以參考下
    2024-05-05
  • Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析

    Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析

    這篇文章主要介紹了Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • JDK集合源碼之解析TreeMap(一)

    JDK集合源碼之解析TreeMap(一)

    下面小編就為大家?guī)硪黄獪\談java中的TreeMap 排序與TreeSet 排序。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-07-07
  • Springboot整合Swagger2后訪問swagger-ui.html 404報(bào)錯(cuò)問題解決方案

    Springboot整合Swagger2后訪問swagger-ui.html 404報(bào)錯(cuò)問題解決方案

    這篇文章主要介紹了Springboot整合Swagger2后訪問swagger-ui.html 404報(bào)錯(cuò),本文給大家分享兩種解決方案,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • SpringBoot開發(fā)中的數(shù)據(jù)源詳解

    SpringBoot開發(fā)中的數(shù)據(jù)源詳解

    這篇文章主要介紹了SpringBoot開發(fā)中的數(shù)據(jù)源詳解,數(shù)據(jù)源(Data Source)顧名思義,數(shù)據(jù)的來源,是提供某種所需要數(shù)據(jù)的器件或原始媒體,在數(shù)據(jù)源中存儲(chǔ)了所有建立數(shù)據(jù)庫連接的信息,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

马关县| 吉安市| 五寨县| 布拖县| 潞城市| 义乌市| 高碑店市| 定西市| 通渭县| 宁都县| 徐州市| 邵东县| 南安市| 大邑县| 青河县| 建德市| 邵东县| 乐都县| 大姚县| 邯郸县| 化隆| 巴彦县| 阳原县| 赣榆县| 板桥市| 城固县| 龙门县| 民县| 响水县| 财经| 保定市| 左贡县| 保康县| 常州市| 广南县| 伊春市| 河西区| 柘城县| 琼结县| 宁武县| 南澳县|