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

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

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

列出目錄中的文件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

這樣寫簡單多了,跟Java老的寫法相比省了不少代碼。下面我們來看下如何列出匹配某個模式的文件。

列出目錄下指定的文件

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

習(xí)慣性的做法是將一個實現(xiàn)了FilenameFilter接口的匿名內(nèi)部類的實例傳給list()方法。比如說,我們來看下如何用這種方式來返回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);

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

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

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

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

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

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

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

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

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

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

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

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

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

這里其實還可以再精簡下代碼,我們不傳lambda表達(dá)式了,傳一個方法引用會讓代碼看起來會更簡潔一些 :

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

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

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

我們通過一個例子來從目錄中過濾出了指定的文件。下面我們來看下如何去遍歷指定目錄下的子目錄。

相關(guān)文章

  • SpringBoot單元測試框架Mockito介紹及使用

    SpringBoot單元測試框架Mockito介紹及使用

    與集成測試將系統(tǒng)作為一個整體測試不同,單元測試更應(yīng)該專注于某個類。所以當(dāng)被測試類與外部類有依賴的時候,尤其是與數(shù)據(jù)庫相關(guān)的這種費時且有狀態(tài)的類,很難做單元測試。但好在可以通過“Mockito”這種仿真框架來模擬這些比較費時的類,從而專注于測試某個類內(nèi)部的邏輯
    2023-01-01
  • Java基于接口實現(xiàn)模擬動物聲音代碼實例

    Java基于接口實現(xiàn)模擬動物聲音代碼實例

    這篇文章主要介紹了Java基于接口實現(xiàn)模擬動物聲音代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • spring如何實現(xiàn)兩個xml配置文件間的互調(diào)

    spring如何實現(xiàn)兩個xml配置文件間的互調(diào)

    這篇文章主要介紹了spring如何實現(xiàn)兩個xml配置文件間的互調(diào),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • springboot中縮短一個url鏈接的實現(xiàn)

    springboot中縮短一個url鏈接的實現(xiàn)

    縮短 URL 是現(xiàn)代應(yīng)用程序中常見的需求,通常用于減少長 URL 的長度,使其更易于分享,URL 縮短服務(wù)的核心思路是將長 URL 映射到一個唯一的短代碼,本文主要介紹了springboot中縮短一個url鏈接的實現(xiàn),感興趣的可以了解一下
    2024-09-09
  • maven配置本地倉庫的方法步驟

    maven配置本地倉庫的方法步驟

    本文主要介紹了maven配置本地倉庫的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring IOC和aop的原理及實例詳解

    Spring IOC和aop的原理及實例詳解

    這篇文章主要介紹了Spring IOC和aop的原理及實例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解決

    SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解決

    這篇文章主要介紹了SpringBoot混合使用StringRedisTemplate和RedisTemplate的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 關(guān)于IDEA中spring-cloud-starter-alibaba-nacos-discovery 無法引入問題

    關(guān)于IDEA中spring-cloud-starter-alibaba-nacos-discovery 無法引入問題

    這篇文章主要介紹了關(guān)于IDEA中spring-cloud-starter-alibaba-nacos-discovery 無法引入問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • spring boot配置MySQL數(shù)據(jù)庫連接、Hikari連接池和Mybatis的簡單配置方法

    spring boot配置MySQL數(shù)據(jù)庫連接、Hikari連接池和Mybatis的簡單配置方法

    這篇文章主要介紹了spring boot配置MySQL數(shù)據(jù)庫連接、Hikari連接池和Mybatis的簡單配置方法,需要的朋友可以參考下
    2018-03-03
  • Spring Boot配置Thymeleaf(gradle)的簡單使用

    Spring Boot配置Thymeleaf(gradle)的簡單使用

    今天小編就為大家分享一篇關(guān)于Spring Boot配置Thymeleaf(gradle)的簡單使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評論

含山县| 建湖县| 陵川县| 青岛市| 工布江达县| 曲阳县| 巴马| 平泉县| 邮箱| 景泰县| 灵石县| 丁青县| 双柏县| 吉安县| 漳州市| 黑龙江省| 阆中市| 平远县| 余江县| 瑞昌市| 原平市| 巧家县| 博爱县| 罗城| 北流市| 孝义市| 天峨县| 武川县| 广汉市| 建平县| 汕头市| 维西| 宜阳县| 元江| 分宜县| 平果县| 新和县| 武义县| 绥德县| 偏关县| 郧西县|