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

Java函數(shù)式編程(十一):遍歷目錄

 更新時(shí)間:2014年09月26日 09:34:40   作者:有孚  
這篇文章主要介紹了Java函數(shù)式編程(十一):遍歷目錄,本文是系列文章的第11篇,其它文章請(qǐng)參閱本文底部的相關(guān)文章,需要的朋友可以參考下

列出目錄中的文件

用File類的list()方法可以很容易的列出目錄中的所有文件的文件名。如果想要獲取文件而不止是文件名的話,可以使用它的listFiles()方法。這很簡(jiǎn)單,難的是怎么去處理這個(gè)返回的列表。我們不再使用傳統(tǒng)的冗長(zhǎng)的外部迭代器,而是使用優(yōu)雅的函數(shù)式來(lái)實(shí)遍歷這個(gè)列表。這里我們還得用到JDK的新的CloseableStream接口以及一些相關(guān)的高階函數(shù)。

下面這段代碼可以列出當(dāng)前目錄下所有文件的名字。

復(fù)制代碼 代碼如下:

Files.list(Paths.get("."))
     .forEach(System.out::println);

如果想列出別的目錄的話,可以把”.”替換成想要訪問(wèn)的目錄的完整路徑。

這里先是使用了Paths的get()方法,通過(guò)一個(gè)字符串創(chuàng)建了一個(gè)Path實(shí)例。然后通過(guò)Files工具類的list()方法獲取到了一個(gè)ClosableStream對(duì)象,我們可以用它來(lái)遍歷目錄下的所有文件。然后我們使用內(nèi)部迭代器forEach()來(lái)打印出文件名。我們先來(lái)看下這段代碼的部分輸出結(jié)果:列出當(dāng)前目錄下的文件及子目錄。

復(fù)制代碼 代碼如下:

./aSampleFiles.txt
./bin
./fpij
...

如果我們只想獲取當(dāng)前目錄的子目錄,而不要文件的話,可以使用filter()方法:

復(fù)制代碼 代碼如下:

Files.list(Paths.get("."))
     .filter(Files::isDirectory)
     .forEach(System.out::println);

ilter()方法將目錄從文件流中篩選出來(lái)。我們把Files類的isDirectory方法的引用傳了進(jìn)去,而不是傳遞一個(gè)lambda表達(dá)式?;叵胂耭ilter()方法它需要的是一個(gè)返回boolean值的Predicate類型,這個(gè)方法正好合適。最后我們用一個(gè)內(nèi)部迭代器來(lái)打印出目錄的名字。程序?qū)?huì)打印出當(dāng)前目錄的子目錄。

復(fù)制代碼 代碼如下:

./bin
./fpij
./output
...

這樣寫簡(jiǎn)單多了,跟Java老的寫法相比省了不少代碼。下面我們來(lái)看下如何列出匹配某個(gè)模式的文件。

列出目錄下指定的文件

Java很早前就提供了一個(gè)list()方法的變種,用來(lái)篩選文件名。這個(gè)版本的list()方法接受一個(gè)FilenameFilter類型的參數(shù)。這個(gè)接口只有一個(gè)accept()方法,它接受兩個(gè)參數(shù):File dir(代表目錄),以及String name(代表文件名)。accept()方法返回true的話這個(gè)文件名就會(huì)出現(xiàn)在返回的列表中,返回false則不在。我們來(lái)實(shí)現(xiàn)一下這個(gè)方法。

習(xí)慣性的做法是將一個(gè)實(shí)現(xiàn)了FilenameFilter接口的匿名內(nèi)部類的實(shí)例傳給list()方法。比如說(shuō),我們來(lái)看下如何用這種方式來(lái)返回fpij目錄下的.java文件。

復(fù)制代碼 代碼如下:

final String[] files =
new File("fpij").list(new java.io.FilenameFilter() {
public boolean accept(final File dir, final String name) {
return name.endsWith(".java");
}
});
System.out.println(files);

這著實(shí)得費(fèi)些工夫?qū)憥仔写a。這樣的代碼太聒噪了:創(chuàng)建對(duì)象,調(diào)用函數(shù),定義匿名內(nèi)部類,在類里面嵌入方法等等。我們不用再忍受這樣的痛苦了,只需傳一個(gè)接受兩個(gè)參數(shù)并返回bollean的lambda表達(dá)式進(jìn)去就好了。Java編譯器會(huì)搞定剩下的事。

前面那個(gè)例子可以簡(jiǎn)單的用一個(gè)lambda表達(dá)式替換掉匿名內(nèi)部就好了,但是還有進(jìn)一步優(yōu)化的空間。新的DirectoryStream工具可以幫助我們更高效的遍歷大的目錄結(jié)構(gòu)。我們來(lái)試下這種方法。這是newDirectoryStream()方法的一個(gè)變種,它接受一個(gè)額外的過(guò)濾器。

復(fù)制代碼 代碼如下:

Files.newDirectoryStream(
      Paths.get("fpij"), path -> path.toString().endsWith(".java"))
     .forEach(System.out::println);

這樣我們?nèi)サ袅四涿麅?nèi)部類并把繁瑣的代碼變得簡(jiǎn)潔明了。這兩個(gè)版本的輸出結(jié)果是一樣的。我們來(lái)打印下指定的文件。

這段代碼只會(huì)輸出指定目錄下的.java文件,下面是它的部分輸出結(jié)果:

復(fù)制代碼 代碼如下:

fpij/Compare.java
fpij/IterateString.java
fpij/ListDirs.java
...

我們基于文件名來(lái)篩選文件,同樣也可以很容易通過(guò)文件屬性,比如文件是不是可執(zhí)行文件,是否可讀,可寫等來(lái)進(jìn)行篩選。這么做的話得需要一個(gè)listFiles()方法,它接受一個(gè)FileFilter類型的參數(shù)。我們?nèi)匀皇褂胠ambda表達(dá)式來(lái)實(shí)現(xiàn)而不是去創(chuàng)建匿名內(nèi)部類。現(xiàn)在來(lái)看一個(gè)列出當(dāng)前目錄下所有隱藏文件的例子。

復(fù)制代碼 代碼如下:

final File[] files = new File(".").listFiles(file -> file.isHidden());

如果我們操作的是一個(gè)很大的目錄,可以使用DirectoryStream而不是直接調(diào)用File上面的方法。

我們傳給listFiles()方法的lambda表達(dá)式的簽名和FileFilter接口的accept()方法的簽名是一樣的。這個(gè)lambda表達(dá)式接受的是一個(gè)File實(shí)例的參數(shù),在這個(gè)例子中參數(shù)名是file。如果文件是隱藏屬性的話,剛返回true,否則返回false.

這里其實(shí)還可以再精簡(jiǎn)下代碼,我們不傳lambda表達(dá)式了,傳一個(gè)方法引用會(huì)讓代碼看起來(lái)會(huì)更簡(jiǎn)潔一些 :

復(fù)制代碼 代碼如下:

new File(".").listFiles(File::isHidden);

我們先用lambda表達(dá)式實(shí)現(xiàn),隨后又使用方法引用將它重構(gòu)得更加簡(jiǎn)潔。如果我們?cè)賹懶碌拇a的話,當(dāng)然應(yīng)該采用這種簡(jiǎn)潔的方式。如果可以早點(diǎn)發(fā)現(xiàn)這種簡(jiǎn)潔的實(shí)現(xiàn),我們當(dāng)然要優(yōu)先使用它。有一句話叫做”先讓它能工作,然后再去優(yōu)化(make it work, then make it better)",先讓代碼能跑起來(lái),等我們理清楚了,才去考慮簡(jiǎn)潔性和性能等進(jìn)行優(yōu)化。

我們通過(guò)一個(gè)例子來(lái)從目錄中過(guò)濾出了指定的文件。下面我們來(lái)看下如何去遍歷指定目錄下的子目錄。

相關(guān)文章

  • 深入學(xué)習(xí)JavaWeb中監(jiān)聽(tīng)器(Listener)的使用方法

    深入學(xué)習(xí)JavaWeb中監(jiān)聽(tīng)器(Listener)的使用方法

    這篇文章主要為大家詳細(xì)介紹了深入學(xué)習(xí)JavaWeb中監(jiān)聽(tīng)器(Listener)的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java中父類怎么調(diào)用子類的方法

    Java中父類怎么調(diào)用子類的方法

    這篇文章主要介紹了Java父類調(diào)用子類的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 關(guān)于SpringBoot使用Redis空指針的問(wèn)題(不能成功注入的問(wèn)題)

    關(guān)于SpringBoot使用Redis空指針的問(wèn)題(不能成功注入的問(wèn)題)

    這篇文章主要介紹了關(guān)于SpringBoot使用Redis空指針的問(wèn)題(不能成功注入的問(wèn)題),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java框架MyBatis接口編程過(guò)程解析

    Java框架MyBatis接口編程過(guò)程解析

    這篇文章主要介紹了Java框架MyBatis接口編程過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java的synchronized關(guān)鍵字深入解析

    Java的synchronized關(guān)鍵字深入解析

    這篇文章主要介紹了Java的synchronized關(guān)鍵字深入解析,在并發(fā)編程中,多線程同時(shí)并發(fā)訪問(wèn)的資源叫做臨界資源,當(dāng)多個(gè)線程同時(shí)訪問(wèn)對(duì)象并要求操作相同資源時(shí),分割了原子操作就有可能出現(xiàn)數(shù)據(jù)的不一致或數(shù)據(jù)不完整的情況,需要的朋友可以參考下
    2023-12-12
  • Java實(shí)現(xiàn)多線程文件下載的代碼示例

    Java實(shí)現(xiàn)多線程文件下載的代碼示例

    本篇文章主要介紹了Java實(shí)現(xiàn)多線程下載的代碼示例,Java多線程可以充分利用CPU的資源,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Java非阻塞I/O模型之NIO相關(guān)知識(shí)總結(jié)

    Java非阻塞I/O模型之NIO相關(guān)知識(shí)總結(jié)

    在了解NIO (Non-Block I/O) 非阻塞I/O模型之前,我們可以先了解一下原始的BIO(Block I/O) 阻塞I/O模型,NIO模型能夠以非阻塞的方式更好的利用服務(wù)器資源,需要的朋友可以參考下
    2021-05-05
  • Java在PowerPoint中添加上標(biāo)和下標(biāo)的實(shí)現(xiàn)方法

    Java在PowerPoint中添加上標(biāo)和下標(biāo)的實(shí)現(xiàn)方法

    當(dāng)我們?cè)谘菔疚母逯刑砑由虡?biāo)、版權(quán)或其他符號(hào)時(shí),我們可能希望該符號(hào)出現(xiàn)在某個(gè)文本的上方或下方。在Microsoft PowerPoint中,我們可以通過(guò)對(duì)符號(hào)應(yīng)用上標(biāo)或下標(biāo)格式來(lái)實(shí)現(xiàn)這種效果,這篇文章主要介紹了Java在PowerPoint中添加上標(biāo)和下標(biāo),需要的朋友可以參考下
    2022-10-10
  • jpa?EntityManager?復(fù)雜查詢實(shí)例

    jpa?EntityManager?復(fù)雜查詢實(shí)例

    這篇文章主要介紹了jpa?EntityManager?復(fù)雜查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java 判斷一個(gè)時(shí)間是否在另一個(gè)時(shí)間段內(nèi)

    Java 判斷一個(gè)時(shí)間是否在另一個(gè)時(shí)間段內(nèi)

    這篇文章主要介紹了Java 判斷一個(gè)時(shí)間是否在另一個(gè)時(shí)間段內(nèi)的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評(píng)論