亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

legendmohe / 3442人閱讀

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

方法引用:

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

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

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

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

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

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

首先listFiles方法接受了一個(gè)FileFilter類型的對(duì)象,list方法是獲取所有的文件,files是用來存儲(chǔ)篩選之后的元素,循環(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對(duì)象是什么,發(fā)現(xiàn)它是一個(gè)接口,所以Java 8之前的寫法都是寫了個(gè)匿名對(duì)象來實(shí)現(xiàn)這個(gè)接口,重寫它的accept方法??吹竭@里其實(shí)很明顯了,這就是一個(gè)策略模式的應(yīng)用。而方法引用就是讓我們直接把需要在accept方法里調(diào)用的方法傳遞進(jìn)去,不需要像以前一樣來個(gè)全家桶寫一堆固定模板。

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

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

Lambda-匿名函數(shù):

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

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

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

2.以上只是Lambda表達(dá)式最簡(jiǎn)單的方式,我們還可以有下列這些更加多樣化的操作,Lambda表達(dá)式在Java 8中是非常重要的部分,因?yàn)楹竺嫖覀冎v到的stream(流)就是基于它來使用的。

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71433.html

相關(guān)文章

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

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

    isLishude 評(píng)論0 收藏0
  • Java 8 新特性方法引用

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

    wudengzan 評(píng)論0 收藏0
  • Java8-8-方法引用詳解

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

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

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

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

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

    haoguo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

legendmohe

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<