成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java 8之方法引用和Lambda表達(dá)式

legendmohe / 3399人閱讀

摘要:方法引用在之前只能進(jìn)行值傳遞,方法是不能傳遞的。首先方法接受了一個類型的對象,方法是獲取所有的文件,是用來存儲篩選之后的元素,循環(huán)所有獲得到的文件數(shù)組,然后調(diào)用中的方法來進(jìn)行條件篩選,放入后返回。

方法引用:

在Java 8之前只能進(jìn)行值傳遞,方法是不能傳遞的。如果你想調(diào)用一個方法你必須先獲取到它所在的類的實例,然后再通過實例去調(diào)用這個方法,但是Java 8新增了方法引用這個新特性可以讓你直接把方法當(dāng)做值來傳遞。

1.下面這段代碼代碼的作用是遍歷獲取目錄下所有的文件和目錄,并且還加了一個篩選條件,只篩選出不隱藏的文件和目錄,這里我們其實只是想調(diào)用FileFilte中的accept方法來進(jìn)行篩選,但是我們需要先創(chuàng)建FileFilter的匿名對象,然后重寫整個accept方法,這樣我們才調(diào)用到了這個方法,其中只有第三行代碼是會有變化的,其他的代碼都是固定的,但是我們每次還是要把其他固定的模板代碼重新寫一遍。

File[] hiddenFiles = new File("F:	est").listFiles(new FileFilter() {
    public boolean accept(File file) {
        return !file.isHidden();
    }
});  

2.現(xiàn)在Java 8中的方法引用就解決了這個問題,讓我們看下列的代碼,我們發(fā)現(xiàn)匿名類和重寫方法的步驟都已經(jīng)沒有了,上述代碼的本質(zhì)其實就是調(diào)用傳進(jìn)來的File對象的isHidden方法,現(xiàn)在File:: isHiden這個寫法就是和上面的代碼是同樣的作用,但是代碼精簡了很多,那些無用的冗余代碼都不見了。

File[] hiddenFiles = new File("F:	est").listFiles(File::isHidden);

3.我們從源碼來看看listFiles方法做了什么操作,而這兩種寫法又有什么不同。

首先listFiles方法接受了一個FileFilter類型的對象,list方法是獲取所有的文件,files是用來存儲篩選之后的元素,循環(huán)所有獲得到的文件數(shù)組,然后調(diào)用FileFilter中的accept方法來進(jìn)行條件篩選,放入files后返回。

  public File[] listFiles(FileFilter filter) {
      String ss[] = list();
      if (ss == null) return null;
      ArrayList files = new ArrayList<>();
      for (String s : ss) {
          File f = new File(s, this);
          if ((filter == null) || filter.accept(f))
              files.add(f);
      }
      return files.toArray(new File[files.size()]);
  }

再看看FileFilter對象是什么,發(fā)現(xiàn)它是一個接口,所以Java 8之前的寫法都是寫了個匿名對象來實現(xiàn)這個接口,重寫它的accept方法。看到這里其實很明顯了,這就是一個策略模式的應(yīng)用。而方法引用就是讓我們直接把需要在accept方法里調(diào)用的方法傳遞進(jìn)去,不需要像以前一樣來個全家桶寫一堆固定模板。

  @FunctionalInterface
  public interface FileFilter {
      boolean accept(File pathname);
  }

4.下面的圖介紹了Java 8之前和之后這段代碼的邏輯流程,在Java 8之前是需要先創(chuàng)建FileFilter匿名對象然后再調(diào)用File.listFiles方法,而現(xiàn)在只需要File::isHiden寫法就可以達(dá)到同樣的目的,其實它的含義就是創(chuàng)建了一個方法引用,所以你可以通過傳遞引用來傳遞這個方法,就好像你new了一個對象的引用,然后你把這個引用傳遞到別的地方,你就可以調(diào)用這個對象里的屬性和方法是一樣的道理。

Lambda-匿名函數(shù):

上面的方法引用讓我們可以把方法也當(dāng)做值來進(jìn)行傳遞,但是有時候我們傳遞進(jìn)去的代碼并沒有像File.isHidden方法一樣封裝起來,而這種情況也是經(jīng)常發(fā)生的,有時候為了一個特殊需求我需要寫段代碼來解決,但是次數(shù)用的極少,沒必要封裝個方法,而Lambda表達(dá)式則解決了這個問題。

1.比如我們想要篩選出一個文件名叫abc.txt的文件,我們可以這樣寫,我們看到 file.getName(). equals("abc.txt"));是我們自己寫出來的,我們并沒有把它封裝成方法就拿來使用了,注意看->符號前面,那個代表的是上面accept方法接受的參數(shù),而->后面則是我們拿傳遞進(jìn)來的參數(shù)來操作,只是要確保你的這行代碼返回的類型是要和accept方法的返回類型一致。

File[] files3 = new File("F:	est").listFiles((File file) -> file.getName().equals("abc.txt"));

2.以上只是Lambda表達(dá)式最簡單的方式,我們還可以有下列這些更加多樣化的操作,Lambda表達(dá)式在Java 8中是非常重要的部分,因為后面我們講到的stream(流)就是基于它來使用的。

//單個參數(shù)的時候可以省略括號和類型,直接寫形參
File[] files4= new File("F:	est").listFiles((file -> file.getName().equals("abc.txt")));

//如果要寫多行代碼,可以加大括號把所有代碼括起來,最后你同樣需要返回正確的類型
File[] files5= new File("F:	est").listFiles(
        (File file) ->
        {
            boolean flag = file.getName().equals("d") && file.getName().contains("d");
            return  flag;
        }
);

下面我會增加一篇文章關(guān)于Lambda表達(dá)式的實際應(yīng)用,好讓大家更好的理解它們的用法。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71433.html

相關(guān)文章

  • Java8 lambda 達(dá)式、方法引用、函數(shù)式接口、默認(rèn)方式、靜態(tài)方法

    摘要:歐陽思海繼承接口后,又加了新的抽象方法,這個接口就不再是函數(shù)式接口默認(rèn)方法在接口中添加了一個默認(rèn)方法??偨Y(jié)在這篇文章中,我們講了表達(dá)式方法引用函數(shù)式接口接口中的靜態(tài)方法接口中的默認(rèn)方法的使用。 今天我來聊聊 Java8 的一些新的特性,確實 Java8 的新特性的出現(xiàn),給開發(fā)者帶來了非常大的便利,可能剛剛開始的時候會有點不習(xí)慣的這種寫法,但是,當(dāng)你真正的熟悉了之后,你一定會愛上這些新的...

    isLishude 評論0 收藏0
  • Java 8 新特性方法引用

    摘要:概述簡介若體中的功能,已經(jīng)有方法提供了實現(xiàn),可以使用方法引用可以將方法引用理解為表達(dá)式的另外一種表現(xiàn)形式方法引用的三種形式對象的引用實例方法名類名靜態(tài)方法名類名實例方法名注意方法引用所引用的方法的參數(shù)列表與返回值類型,需要與函數(shù)式接口中抽象 1. 概述 1.1 簡介 若 Lambda 體中的功能,已經(jīng)有方法提供了實現(xiàn),可以使用方法引用(可以將方法引用理解為 Lambda 表達(dá)式的另外一...

    wudengzan 評論0 收藏0
  • Java8-8-方法引用詳解

    摘要:實際上方法引用是表達(dá)式的一種語法糖。小結(jié)本篇全面介紹了方法引用的四種使用方式,且每種方式都有對應(yīng)一個示例來幫助大家理解。 上一篇我們詳細(xì)介紹了Optional類用來避免空指針問題,本篇我們?nèi)媪私庖幌翵ava8中的方法引用特性。方法引用是lambda表達(dá)式的一種特殊形式,如果正好有某個方法滿足一個lambda表達(dá)式的形式,那就可以將這個lambda表達(dá)式用方法引用的方式表示,但是如果這...

    劉東 評論0 收藏0
  • 樂字節(jié)Java8核心特性實戰(zhàn)方法引用

    摘要:大家好,我是樂字節(jié)的小樂,上一次我們說到了核心特性之函數(shù)式接口,接下來我們繼續(xù)了解又一核心特性方法引用。方法引用是一種更簡潔易懂的表達(dá)式。感謝光臨閱讀小樂的,敬請關(guān)注樂字節(jié)后續(xù)將繼續(xù)講述等前沿知識技術(shù)。 大家好,我是樂字節(jié)的小樂,上一次我們說到了Java8核心特性之函數(shù)式接口,接下來我們繼續(xù)了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...

    lakeside 評論0 收藏0
  • Java 8 Lambda 達(dá)式詳解

    摘要:表達(dá)式簡介表達(dá)式是一個匿名函數(shù)對于而言并不很準(zhǔn)確,但這里我們不糾結(jié)這個問題。如果表達(dá)式的正文有一條以上的語句必須包含在大括號代碼塊中,且表達(dá)式的返回值類型要與匿名函數(shù)的返回類型相同。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我們想要把某些功能傳遞給某些方...

    haoguo 評論0 收藏0

發(fā)表評論

0條評論

legendmohe

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<